首先是劃分演算法,假設每次都以第乙個元素作為樞軸值,進行一趟劃分:
int partition(int a, int low, int high)
a[low] = pivot; //將樞軸值元素置於最終位置
return low;
}
第乙個while迴圈裡的**還可以採用如下形式:
while (low < high && a[high] >= pivot)
--high;
while (low < high && a[low] <= pivot)
++low;
if(low < high)
遞迴呼叫快速排序演算法的劃分操作,如下:
1
2
3
4
5
6
7
8
9
10
11
12
void
quicksort(
int
a,
int
low,
int
high)
}
由於快速排序是遞迴的,需要借助乙個遞迴工作棧來儲存每一層遞迴呼叫的必要資訊。因為要進行n-1次遞迴呼叫,所以棧的深度o(n);平均情況下,棧的深度為o(logn)。
時間效率:
快速排序的執行時間與劃分是否對稱有關,而後者又與具體使用的劃分演算法有關。快速排序的最壞情況發生在劃分時兩個區域分別包含n-1和0個元素時,這種最大程度的不對稱性多發生在每一層遞迴上,亦即對應於初始排序表基本有序或基本逆序時,就得到最壞的情況下的複雜度,為o(n^2)。
在快速排序中,並不產生有序子串行,但每一趟排序後都將乙個元素置於最終位置。
快速排序優化成最壞o(nlogn):
採用media-of-three選擇樞軸值可以比較好的避免劃分惡化的情況,另外因為快排函式在函式尾部有兩次遞迴操作,我們可以對其使用尾遞迴優化。其中第二次遞迴可以用迭代代替。(如果可以結合其他的排序方法的話,還可以結合堆排序,很多庫中的排序演算法都是混合排序的,根據資料的情況和規模大小採用不同的排序方法,並把它們組合起來。比如stl中的sort排序演算法,結合了插入排序、快速排序、堆排序)
快速排序的非遞迴實現:
其實就是手動利用棧來儲存每次分塊快排的起始點,棧非空時迴圈獲取中軸入棧
快速排序非遞迴實現
再來談談快速排序,遞迴實現與非遞迴實現。遞迴實現是基本的排序 非遞迴實現需要用stack來儲存 low,high 的排序對,一部分一部分的排序。直接上程式了 標頭檔案 quick test.h include include include include include include typed...
快速排序 遞迴和非遞迴的實現
快速排序主要就是partition的操作。遞迴的實現。a 要排序的陣列,s 開始位置,e 結束位置 void quicksort int arr,int s,int e 普通劃分操作。以最後乙個元素 arr e 作為基準 intpartition int arr,int s,int e swap a...
遞迴和非遞迴快速排序 Python實現
快速排序的原理是基於分治策略,設定乙個基準線 pivot 將資料分為兩部分,不斷分治實現資料的排序 由實現原理容易得到遞迴 如下 def qsort arr ifnot len arr return else 在這裡以第乙個元素為基準線 pivot arr 0 left qsort x for x ...