void FastSortHelper(vector<int>&a, int s, int t){ if (t <= s) return; int k = a[s]; int i = s; //start searching position int j = t; //end searching position while (i < j){ int x; for (x = j; x >= s; x--){ if (a[x] < k){ j = x; break; } } for (x = i; x <= j; x++){ if (a[x] > k){ i = x; break; } if (x >= j){ i = j; break; } } swapab(a[i], a[j]); } swapab(a[s], a[j]); FastSortHelper(a, j + 1, t); FastSortHelper(a, s, j - 1); } void FastSort(vector<int> &a){ if (a.size() <= 1) return; FastSortHelper(a, 0, a.size() - 1);
桶排序在有限的數據範圍內複雜度是 n
冒泡排序是n方
快速排序最差情況的複雜度和冒泡一樣是n方,但是平均算法複雜度是nlogn
核心思想,快速排序不再像冒泡一樣一遍又一遍的遍歷,爲每個元素尋找最後的位置。快排會尋找一個基準數,比基準數小的放左邊,比基準數大的放右邊。
參考啊哈算法,對於初始序列“6 1 2 7 9 3 4 5 10 8”,6是基準數。小A從左往右找第一個大於6的數,小B從右往左找第一個小於6的數。然後AB交換所在位置的數字。每次B先找, A後找,直到AB碰面的位置。基準數的位置與碰面位置上的數交換。之後對於基準數兩側的數重複做改操作。遞歸!