快速排序qsort是所有學習演算法和資料結構最基礎的乙個部分,也是考試題和面試的乙個小重點。
快速排序的時間複雜度為o(n*lgn),而且常數因子很小。
對於隨機資料,效率特別高;
對於構造的惡意資料,最壞複雜度為o(n2),解決方案為採用隨機化的快排。
除了時間效率上的優勢,快速排序進行就地排序,即在原陣列中進行元素交換,僅需要少量臨時變數。這也是qsort在空間上的優勢。
注意:快速排序屬於不穩定排序。
qsort本質上是一種分治策略。每次通過陣列內的元素交換,使得對於乙個選定的元素x擺在合理的位置,即所有x左邊的元素都不大於x,x右邊的元素都不小於x。這樣只需要分別對x左邊和右邊兩個區間分別遞迴執行相同的過程即可完成整個序列的排序。
對於區間a[l,…,r],我們每次選定a[r]為上述的x。
然後從a[l]開始處理,直到處理到a[r-1]這個元素。處理過程中,把序列維護如下所示的情形:
如圖,在逐個元素處理過程中,綠色表示不大於x的這些元素;黃色表示不小於x的這些元素;y箭頭處表示當前正在處理的元素y;白色的部分表示還未處理的這些元素。
整個過程需要記錄的乙個最重要的位置是第乙個黃色元素的位置,因為後續的交換都是圍繞第乙個黃色元素位置進行的(當然這個位置不是固定的,會隨著元素的增多向後移動)。
比較y和x,如果y<=x,那麼說明y可以加入綠色陣營,此時只需要交換y和第乙個黃色位置的值,黃色的區域向右移動一位就可以持續保持當前的性質了;如果y>x(等於號在哪個判斷條件並不重要,為什麼?),直接y加入黃色陣營,啥也不要做,因為性質得到保持。
最後我們得到乙個這樣的結果,即除了最後乙個a[r]沒有處理。
此時我們只需要交換a[r]與第乙個黃色的值,就可以了。
此時只要對左邊和右邊分別進行遞迴分治,就可以完成整個序列的排序了。
實現中還有一些細節請一定注意哦。
qsort 快速排序
qsort函式是ansi c標準中提供的,其宣告在stdlib.h檔案中,是根據二分法寫的,其時間複雜度為n log n 其結構為 void qsort void base,size t nelem,size t width,int comp const void const void 其中 bas...
qsort 快速排序
cpp view plain copy print?void qsort void base,size t nmemb,size t size,int compare const void const void 函式原型在中找到 html view plain copy print?base 指向陣...
qsort快速排序
函式原型 void qsort void base size t num,size t width,int cdecl compare const void const void 標頭檔案 stdlib.h size t num 陣列中待排序元素的數量 size t width 各元素占用空間大小 ...