快速排序的體會

2021-06-21 11:19:22 字數 2408 閱讀 5754

說來快速排序是屬於交換排序的一種。

其思想(對於公升序排序來說):

1. 首先是分割操作:任意選擇陣列中的任意元素作為中位數,此中位數將陣列分為兩部分a[.....,中位數,.....]

2. 左半部分的數值都小於或等於此中位數,右半部分的數值都大於或等於此中位數。

3. 然後對左半部分的陣列進行遞迴分割操作,對右半部分的陣列進行遞迴分割操作。直到每乙個部分只有乙個元素或為空為止,則所有元素放在了它應該在的位置上。

注意!每一次分割操作,都產生乙個中位數,而每次分割後,這個中位數就在它最終排序的位置上。

分割操作:如下例子:

下標:0    1     2    3    4    5    6    7

數值:49  38  65  97  76  13  27  49

1. 選取陣列中的任意乙個元素作為中位數。這裡我們選取a[0]==49.且int temp=a[0];將中位數的值記錄下來。

2. 設定兩個標記值low和high來記錄當前的下標,low的初始值為0,high的初始值為7.

3. 從high==7開始看起,a[high]==49,a[high]>=temp,則high=high-1;則此時看high==6;a[high]==27, a[high]下標:0    1     2    3    4    5    6    7

數值:27  38  65  97  76  13  27  49

4. 從low==0開始看起,a[low]<=temp,則low=low+1;

此時low==1;再看a[low]==38, a[low]<=temp;則low=low+1;

此時low==2;再看a[low]==65,a[low]>temp;則a[high]=a[low];

下標:0    1     2    3    4    5    6    7

數值:27  38  65  97  76  13  65  49

5. high==6;a[high]>=temp;high-=1;

high==5;a[high]下標:0    1     2    3    4    5    6    7

數值:27  38  13  97  76  13  65  49

6. low==2; a[low]<=temp;low+=1;

low==3; a[low]>temp;a[high]=a[low];

下標:0    1     2    3    4    5    6    7

數值:27  38  13  97  76  97  65  49

7. high==5; a[high]>=temp;high-=1;

high==4; a[high]>=temp;high-=1;

high==3;

!!!!注意此時low==3;high==low;則此次分割結束。且a[high/low]=temp;

下標:0    1     2    3    4    5    6    7

數值:27  38  13  49  76  97  65  49

分割結束!此次的中位數為49.且它落於下標為3的位置上。

int partion(int a,int low,int high)

a[high]=temp;

return high;

}void quicksort(int a,int low,int high){

if(low注意!  while(low=a[low])如果改為

while(lowa[low])行不行?

答案是否定的!不行!

如果在分割過程中,陣列中有乙個數與中位數相等,則會出現死迴圈。

按照上面的例子來看,如果改為下面的條件的話,在分割操作的步驟1中,此時high==7,low==0,

進入迴圈while(low然後,進入第二個while迴圈while(lowa[low])low--;再看此時a[low]==49;temp==49;則也直接跳出迴圈,a[7]==49;low還是等於0;

這樣就會進入死迴圈,它一直呆在這裡不動,low和high始終是0和7。

注意!

迴圈條件while(low

希爾排序的體會

希爾排序屬於插入排序的一種,每次設定乙個步長dk,則把原陣列分為dk個分陣列 a1 0,dk,2dk,3dk,4dk,a2 1,dk 1,2dk 1,3dk 1,4dk 1,a3 2,dk 2,2dk 2,3dk 2,4dk 2,每個分陣列分別進行直接插入排序。然後將dk的值逐漸減小,再進行如上排序...

歸併排序的體會

歸併演算法就是將乙個陣列先遞迴分成n個部分,每個部分有乙個元素,然後再兩兩合併 對於二路歸併演算法而言 合併成n 2個有序部分,每個部分有兩個元素 可能最後乙個部分有乙個元素 然後再將這些部分再兩兩合併,合併成n 4個有序部分。遞迴,直到合併成乙個部分。這樣就排好序了。效能分析 時間複雜度為o n ...

快速排序的改進 隨機快速排序

快速排序是一種高效的排序方法,但是如果我們的輸入陣列是排好序的乙個陣列,快速排序的執行時間就會變成o n 2 雖然這種情況很少會出現,但我們還是應該避免。演算法導論書籍中的修改方法 在排序方法中隨機化選取主元。根據計算,改進後的方法時間複雜度的期望為o nlgn 下面是改進後的 快速排序 publi...