我是看了這個
以後瞭解快排的,一邊看,一邊自己撕了8張紙頭類比。
快排想法還比較簡單,直接拉了嚴蔚敏的代碼。
對於快速排序的種種最佳化,希望高手能夠指點。
待到幾個最常見的排序演算法上齊了,一定將最佳化技巧奉上。
/*<br />快速排序基礎版本<br />未作最佳化,很多時候原數組是有序的,此時(也是最壞情況)時間複雜度到O(n^2),並且棧的深度也到O(n)。<br />一個比較省力又效果顯著的最佳化是每次選擇區間段中間的數來分割,進而分治排序。<br />《資料結構》P277中提到的降低棧深度的方法不甚理解,望高手指點。<br />*/<br />#include <stdio.h></p><p>typedef int Data;<br />const int MaxN = 101;<br />Data arr[MaxN];</p><p>bool bigger(Data a , Data b)<br />{<br />return a >= b;<br />}</p><p>int Partition(Data *a , int low , int high , bool (*cmp)(Data,Data))<br />{<br />Data pivot = a[low];<br />while (low < high){<br />while (low < high && cmp(a[high] , pivot)) high --;<br />a[low] = a[high];<br />while (low < high && cmp(pivot , a[low])) low ++;<br />a[high] = a[low];<br />}<br />a[low] = pivot;<br />return low;<br />}</p><p>void Quicksort(Data *a , int low , int high , bool (*cmp)(Data,Data))<br />{<br />if (low >= high)return;<br />int pivot = Partition(a , low , high , cmp);<br />Quicksort(a , low , pivot - 1 , cmp);<br />Quicksort(a , pivot + 1, high , cmp);<br />}</p><p>void __test()<br />{<br />int n , i;<br />scanf("%d" , &n);<br />for (i = 0;i < n;i ++){<br />scanf("%d" , &arr[i]);<br />}<br />Quicksort(arr , 0 , n - 1 , &bigger);<br />puts("快排後的序列:");<br />for (i = 0;i < n;i ++){<br />printf("%d " , arr[i]);<br />}<br />puts("");<br />}<br />int main()<br />{<br />__test();<br />}<br />/*<br />9<br />3 2 3 77 8 999 10 4 3<br />10<br />7 8 77 8 6 4 3 3 2 33<br />*/