快速排序 Quick Sort

2022-07-07 23:30:30 字數 3000 閱讀 2389

之前介紹了堆排序和歸併排序,今天來說說快速排序。快速排序是應用較多的一種排序方法。

資料是隨機整數,時間單位是秒。(網上的資料,僅供參考)

資料規模    快速排序    歸併排序    希爾排序    堆排序

1000萬       0.75           1.22          1.77          3.57

5000萬       3.78           6.29          9.48         26.54  

1億             7.65          13.06        18.79        61.31

堆排序是最差的,這是演算法硬傷,沒辦法的。因為每次取乙個最大值和堆底部的資料(記為x)交換,重新篩選堆,把堆頂的x調整到位,有很大可能是依舊調整到堆的底部(堆的底部x顯然是比較小的數,才會在底部),然後再次和堆頂最大值交換,再調整下來。

從上面看出,堆排序做了許多無用功。

快速排序法是採用遞迴的方式對待排序的數列進行若干次的操作,每次操作使得被操作的數列部分以某個元素為分界值分成兩部分,一部分小於該分界值,另一部分大於該分界值.該分界值一般被稱為"樞軸". 一般先以左邊第乙個數作為分界值,將數列按該分界值分成左右兩部分,左邊部分小於該分界值,右邊部分大於該分界值,然後再對左右兩部分做重複的操作,直到最後完成排序。

以數列 14,11,25,37,9,28 為例,詳細描述執行一趟快速排序的演算法:

1,選擇待排序數列的樞軸,一般以數列的首元素作為樞軸.此數列中,我們選擇首元素14作為樞軸,npivot = 14.

2,設定兩個指標 i 和 j ,分別指向數列的首元素和尾元素. i 指向首元素14, j 指向尾元素28.示意圖如下:

3,向前移動尾指標 j ,使其指向從數列尾部算起首個小於樞軸(即14)的元素,並將該元素置換到頭指標 i 指向的位置._narray[i] =_narray[j].示意圖如下:

首次執行該操作時 i 指標指向處的值實際上就是樞軸的值,此處的操作可以理解為 i 指標指向處的值已在之前被置換到樞軸中,此時, i 指向處已經是乙個空位,在此時用找到的小於樞軸的元素填在此處.

4,向後移動頭指標 i ,使其指向從數列頭部算起首個大於樞軸(即14)的元素,並將該元素置換到尾指標 j 指向的位置._narray[j] =_narray[i].示意圖如下:

此處同樣可以理解為 j 指標指向處的值已在上一步操作中置換了出去. j 處已是乙個空位.

5,如此重複執行步驟3和步驟4,直至 i==j 時結束該迴圈.

6,退出了該迴圈後, i 與 j 必定指向同一位置.在該位置的前部元素,其值均小於樞軸.而在該位置的後部元素,其值均大於樞軸.顯而易見,此時 i 和 j 同時指向的位置就應該是樞軸的"新家"._narray[i]=npivot.如下圖:

至此,一趟排序結束.待排序數列的首元素將該數列分成了比其小和比其大的兩部分.如下圖:

接著,我們對這一大一小兩部分子數列執行相同的排序操作.

如此"遞迴",直至對整個數列完成排序操作。

using

system;

using

system.collections.generic;

using

system.linq;

using

system.text;

using

system.threading.tasks;

namespace

quicksort

;

//myarray = new int ;

int lowindex = 0; //

陣列的起始位置(從0開始)

int highindex = myarray.length - 1; //

陣列的終止位置

//快速排序

quicksortfunction(myarray, lowindex, highindex);

//輸出排完之後的陣列

for (int i = 0; i < myarray.length; i++)

}//快速排序(目標陣列,陣列的起始位置,陣列的終止位置)

private

static

void quicksortfunction(int array, int low, int

high)

}//快速排序的核心部分:確定關鍵值在陣列中的位置,以此將陣列劃分成左右兩區間,關鍵值游離在外。(返回關鍵值應在陣列中的下標)

private

static

int keyvaluepositionfunction(int array, int low, int

high)

temp =array[rightindex];

array[rightindex] =array[leftindex];

array[leftindex] =temp;

//左側動態下標逐漸增加,直至找到大於keyvalue的下標,然後交換他到右端

while (leftindex < rightindex && array[leftindex] <=keyvalue)

temp =array[leftindex];

array[leftindex] =array[rightindex];

array[rightindex] =temp;

}return

leftindex;}}

}

快速排序 QuickSort

快速排序通常用於排序的最佳的使用選擇,其期望執行時間為 o nlgn 能夠進行就地排序。最壞執行時間為 o n 2 演算法描述 分解 divide 陣列 a beg end 被劃分為兩個子陣列 a beg mid 1 和a mid 1 end 使得a beg mid 1 中的資料都小於 a mid ...

快速排序 quicksort

快速排序 quicksort 是分治法的典型例子,它的主要思想是將乙個待排序的陣列以陣列的某乙個元素x為軸,使這個軸的左側元素都比x大,而右側元素都比x小 從大到小排序 然後以這個x在變換後陣列的位置i分為左右兩個子陣列,再分別進行快速排序,直到子陣列中只有乙個元素為止。快速排序演算法如下 void...

快速排序 QuickSort

1,void quicksort int a,int low,int high 這個函式是排序的遞迴部分,mid就是已經確定的基準元素的位置。2,int partition int a,int low,int high 這個函式幹了兩件事 1 挑出來乙個基準元素 這裡選的是最後乙個作為基準 找它的正...