日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

经典排序算法(2)——快速排序算法详解

發(fā)布時(shí)間:2023/12/4 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 经典排序算法(2)——快速排序算法详解 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.


快速排序(Quick Sort)也是一種典型的交換排序算法,通過交換數(shù)據(jù)元素的位置進(jìn)行排序。


一、算法基本思想

(1)基本思想

快速排序的基本思想就是:通過一趟排序?qū)⒁判虻臄?shù)據(jù)分割成獨(dú)立的兩部分,其中一部分的所有數(shù)據(jù)都比另外一部分的所有數(shù)據(jù)都要小,然后再按此方法對(duì)這兩部分?jǐn)?shù)據(jù)分別進(jìn)行快速排序,整個(gè)排序過程可以遞歸進(jìn)行,以此達(dá)到整個(gè)數(shù)據(jù)變成有序序列。快速排序采用了分治法來解決問題。

(2)運(yùn)行過程

快速排序算法的運(yùn)行過程如下:

1、從序列中挑出一個(gè)元素,稱為“基準(zhǔn)”(pivot)。一般是選取序列的第一個(gè)元素。

2、重新排序數(shù)列,所有比基準(zhǔn)值小的元素?cái)[放在基準(zhǔn)前面,所有比基準(zhǔn)值大的元素擺在基準(zhǔn)的后面(相同的數(shù)可以到任一邊)。在這個(gè)分區(qū)結(jié)束之后,該基準(zhǔn)就處于數(shù)列的中間位置。這個(gè)稱為分區(qū)(partition)操作。

3、遞歸地(recursive)把小于基準(zhǔn)值元素的子數(shù)列和大于基準(zhǔn)值元素的子數(shù)列排序。

4、直到序列的大小是0或1,也就是所有元素都已經(jīng)被排序好了,遞歸結(jié)束。

(3)示例

1、一次快速排序過程

所有比基準(zhǔn)值小的元素?cái)[放在基準(zhǔn)前面,所有比基準(zhǔn)值大的元素擺在基準(zhǔn)的后面,最后找到基準(zhǔn)元素的位置。

2、整個(gè)快速排序過程

二、算法實(shí)現(xiàn)(核心代碼)

C++實(shí)現(xiàn):

void swap(int *x, int *y) {int t = *x;*x = *y;*y = t; } void quick_sort_recursive(int arr[], int start, int end) {if (start >= end)return;int mid = arr[end];int left = start, right = end - 1;while (left < right) {while (arr[left] < mid && left < right)left++;while (arr[right] >= mid && left < right)right--;swap(&arr[left], &arr[right]);}if (arr[left] >= arr[end])swap(&arr[left], &arr[end]);elseleft++;quick_sort_recursive(arr, start, left - 1);quick_sort_recursive(arr, left + 1, end); } void quick_sort(int arr[], int len) {quick_sort_recursive(arr, 0, len - 1); }


Java實(shí)現(xiàn):

class quick_sort {int[] arr;private void swap(int x, int y) {int temp = arr[x];arr[x] = arr[y];arr[y] = temp;}private void quick_sort_recursive(int start, int end) {if (start >= end)return;int mid = arr[end];int left = start, right = end - 1;while (left < right) {while (arr[left] < mid && left < right)left++;while (arr[right] >= mid && left < right)right--;swap(left, right);}if (arr[left] >= arr[end])swap(left, end);elseleft++;quick_sort_recursive(start, left - 1);quick_sort_recursive(left + 1, end);}public void sort(int[] arrin) {arr = arrin;quick_sort_recursive(0, arr.length - 1);} }

三、算法改進(jìn)和變種

對(duì)于快速排序改進(jìn)的方法,可以參考《大話數(shù)據(jù)結(jié)構(gòu)這本書》。快速排序的優(yōu)點(diǎn)在于,對(duì)于大量數(shù)據(jù)的時(shí)候,很容易將某個(gè)元素放到對(duì)應(yīng)的位置。而快速排序的缺點(diǎn)也很明顯:

一是如果原始數(shù)據(jù)就是有序的,那么快速排序過程中對(duì)序列的劃分就十分不均勻,將序列分為了1和n-1的大小(而通常希望的最理想狀態(tài)是二分);

二是對(duì)于小數(shù)組進(jìn)行排序時(shí),也需要遞歸進(jìn)行幾次才能將數(shù)據(jù)放到正確的位置;

三是排序快速是不穩(wěn)定的,當(dāng)重復(fù)數(shù)據(jù)很多時(shí)效率比較低。


針對(duì)快速排序的缺點(diǎn),對(duì)于快速排序主要有以下三個(gè)改進(jìn)方案:

(1)優(yōu)化選取基準(zhǔn)pivotkey — — 三數(shù)取中法

三數(shù)取中法的思想如下:選取序列左端、中間和右端三個(gè)數(shù)據(jù)元素,按大小進(jìn)行排序,選擇中間大小的元素作為基準(zhǔn)。

(2)序列較小時(shí)使用插入排序代替快速排序

在遞歸過程,當(dāng)排序的子序列小于預(yù)定的值M時(shí),采用插入插入排序。

(3)重復(fù)元素較多使用三分區(qū)法

通過劃分讓相等的元素連續(xù)地?cái)[放,然后只對(duì)左側(cè)小于V的序列和右側(cè)大于V對(duì)的序列進(jìn)行排序。

如上圖: 從左至右掃描數(shù)組,維護(hù)一個(gè)指針lt使得[lo…lt-1]中的元素都比v小,一個(gè)指針gt使得所有[gt+1….hi]的元素都大于v,以及一個(gè)指針i,使得所有[lt…i-1]的元素都和v相等。元素[i…gt]之間是還沒有處理到的元素,i從lo開始,從左至右開始掃描:

1、如果a[i]<v::交換a[lt]和a[i],lt和i自增;

2、如果a[i]>v:交換a[i]和a[gt],,gt自減;

3、如果a[i]=v:i自增。


四、算法性能(時(shí)間復(fù)雜度、空間復(fù)雜度、穩(wěn)定性分析)

快速排序是通常被認(rèn)為在同數(shù)量級(jí)(O(nlog2n))的排序方法中平均性能最好的。

但若初始序列按關(guān)鍵字有序或基本有序時(shí),快排序反而蛻化為冒泡排序,也就是說快速排序最壞情況下時(shí)間復(fù)雜度為O(n^2),空間復(fù)雜度為O(n)

如果每次排序時(shí)所選的基準(zhǔn)都能講序列進(jìn)行二分,那么此時(shí)的快速排序效果最好,也就是說快速排序在最好情況下的時(shí)間復(fù)雜度為O(nlogn),空間復(fù)雜度為O(logn)

快速排序的平均時(shí)間復(fù)雜度為O(nlogn),空間復(fù)雜度為O(logn)。快速排序是一種不穩(wěn)定的排序算法


參考文獻(xiàn):

1、淺談算法和數(shù)據(jù)結(jié)構(gòu): 四 快速排序?http://www.cnblogs.com/yangecnu/p/Introduce-Quick-Sort.html

2、快速排序算法及其改進(jìn)算法實(shí)現(xiàn)?http://blog.csdn.net/lsjseu/article/details/9749587

3、快速排序及改進(jìn)?http://flyingdutchman.iteye.com/blog/1863691

4、快速排序(2)算法改進(jìn)--小的子文件、三者取中、重復(fù)關(guān)鍵字三路劃分序及改進(jìn)?https://www.zybuluo.com/quinn/note/78606

5、怎樣讓快速排序最快??http://blog.sina.com.cn/s/blog_4dff8712010136jh.html

總結(jié)

以上是生活随笔為你收集整理的经典排序算法(2)——快速排序算法详解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。