說來快速排序是屬於交換排序的一種。
其思想(對於公升序排序來說):
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...