快速排序是對冒泡法排序的一種改進。
快速排序演算法 的基本思想是:將所要進行排序的數分為左右兩個部分,其中一部分的所有資料都比另外一 部分的資料小,然後將所分得的兩部分資料進行同樣的劃分,重複執行以上的劃分操作,直 到所有要進行排序的資料變為有序為止。
可能僅根據基本思想對快速排序的認識並不深,接下來以對n個無序數列a[0], a[1]…, a[n-1]採用快速排序方法進行公升序排列為例進行講解。
(1)定義兩個變數low和high,將low、high分別設定為要進行排序的序列的起始元素和最後乙個元素的下標。第一次,low和high的取值分別為0和n-1,接下來的每次取值由劃分得到的序列起始元素和最後乙個元素的下標來決定。
(2)定義乙個變數val,通 常,val值為要進行排序序列的第乙個元素值。第一次的取值為a[0]。
(3)從high所指向的陣列元素開始向左掃瞄,掃瞄的同時將下標為high的陣列元素依次與val進行比較操作,直到high不大於low或找到第乙個小於val的陣列元素,然後將該值賦值給low所指向的陣列元素, 然後就不移動high。
(4)如果low依然小於high,那麼由low所指向的陣列元素開始向右掃瞄,掃瞄的同時將下標為low的陣列元素值依次與val進行比較操作,直到low不小於high或找到第乙個大於val的陣列元素,然後將該值賦給high所指向的陣列元素。
(5)重複步驟(3) (4),直到low=high為止,這時成功劃分後得到的左右兩部分分別為a[low……pos-1]和a[pos+1……high],其中,pos下標所對應的陣列元素的值就是val,所以在劃分結束時還要將下標為pos的陣列元素賦值 為 val。 ps:經過一輪比較,只是找到了val的位置,其他陣列元素依然是無序的。
(6)將劃分得到的左右兩部分a[low……pos-1]和a[pos+1……high]繼續採用以上操作步驟進行劃分,直到得到有序序列為止。
為了能夠加深讀者的理解,接下來通過一段**來了解快速排序的具體實現方法。
1 #include 2 #include 3執行結果:#define n 6
4int findpos(int arr, int low, int
high)
16 arr[low] =val;
17return
low;18}
19void quick_sort(int arr, int low, int
high)
26return;27
}28int main(void
);31 printf("
排序前 \n");
32for(i=0;i)
33 printf("
%d\t
",arr[i]);
34 quick_sort(arr,0,n-1
);35 printf("
\n 排序後 \n");
36for(i=0; i)
37 printf("
%d\t
", arr[i]);
38 printf ("\n"
);39 system("
pause");
40return0;
41 }
排序前在上面的**中,根據前面介紹的步驟一步步實現了快速排序演算法。接下來通過示意圖來演示快速排序。32 12 7 78 23 45
排序後7 12 23 32 45 78
1>開始是:
2>因為high指向的45比32大,所以high往左移
3>因為high指向的23比32小,所以把23賦值給low
4>因為low指向的23比32小,所以向右移low
5>因為low指向的12比32小,所以向右移low
6>因為low指向的7比32小,所以向右移low
7>因為low指向的78比32大,所以把78賦值給high
8>因為high指向的78比32大,所以向左移high
9>至此low和high重合,low的位置就是val的最終位置
10>然後low到pos-1範圍內的陣列元素,再按上述的操作做排序
11>然後pos+1到high範圍內的陣列元素,再按上述的操作做排序
排序演算法 快速排序演算法
網際網路的大型公司還在火熱招聘中,參與了一次又一次的筆試,都不通過,我還是太菜!作為程式設計人員,需要邁過去 資料結構與演算法 這個坎,畢竟,筆試不會真的很虧,加油吧,少些水,多點實操。一 快速排序演算法思想 從一組資料中找出乙個基準值,一般是選擇中間值作為基準值,然後從左到右將值與基準值進行比較,...
排序演算法 快速排序
快速排序使用分治法 divide and conquer 策略來把乙個序列 list 分為兩個子串行 sub lists 步驟為 1.從數列中挑出乙個元素,稱為 基準 pivot 2.重新排序數列,所有元素比基準值小的擺放在基準前面,所有元素比基準值大的擺在基準的後面 相同的數可以到任一邊 在這個分...
排序演算法 快速排序
圖示 一趟快速 排序的演算法是 1 設定兩個 變數i j,排序開始的時候 i 0,j n 1 2 以第乙個 陣列元素作為關鍵資料,賦值給key,即key a 0 3 從j開始向前搜尋,即由後開始向前搜尋 j 找到第乙個小於key的值a j a i 與a j 交換 4 從i開始向後搜尋,即由前開始向後...