快速排序的寫法

2021-06-23 10:09:10 字數 1036 閱讀 4792

面試中乙個頻率極高的問題就是要手寫快速排序,實際上涉及下標變換的**極其容易寫錯,基本上涉及整數下標操作的問題都算是難度中等偏上的了。

對於一些經典問題,我們要時不時的去練習,這裡給出演算法導論上的和stl中實現的快速排序的兩種不同寫法。

template size_t partition(t *a, size_t p, size_t q)

template void quick_sort(t *a, size_t n)

演算法的關鍵是partiton函式,該函式將陣列a[p..q]中的最後乙個元素作為分割標準pivot,從左到右依次與pivot比較,如果a[i]小於等於pivot則按兵不動,如果a[i]大於pivot則將a[i]與陣列的倒數第二個交換,注意swap(a[i--], q[--q]);這行的細節:q初始為陣列最後乙個元素的下標,交換時它先指向倒數第二個元素,再交換,也就是說q始終保持指向未劃分完成的區域的最後乙個指標的下乙個指標,即左閉右開區間[p, q)始終表示當前未劃分的元素的下標。而i--的保證了交換元素後下一次迴圈依舊使用當前位置的元素與pivot進行比較,因為剛剛交換過來的元素還未與pivot比較過。

for迴圈的終止條件判定為i當for迴圈終止時,q之前的所有元素a[i]均滿足a[i]<=pivot,而q及q之後的元素[q,r)則滿足a[q]>pivot。這時將a[r]與a[q]進行交換就剛好滿足a[q]位置的左側不大於它,a[q]的右側比它大。

再來參考stl中的partition寫法,為了簡便使用了整數。

// [p, q)

int partition(int *a, int p, int q, int pivot)

dowhile (a[q] > pivot);

swap(a[p], a[q]);

++p;

}return p;

}

其快排的寫法應為:

void quick_sort(int *a, int n)

快速排序的簡潔寫法

個人總結的兩種寫法,比較傾向於partition1,乙個邊界畢竟比兩個邊界好控制。此處 基於c 其實也就是用了個vector而已,隨便改改其他語言都可以。好多寫法都可以滿足普通情況,但不滿足特殊用例測試 1,1,1,3這種。共享。include stdafx.h include iostream i...

快速排序的遞迴寫法

快速排序 遞迴 遞迴思想 單趟來說,begin找比key大的,end找比key小的,當各自都找到的時候,若begin比end小,則交換兩個資料,然後繼續找,當再找到的時候,如果 begin比end大,則比較a begin 和key的值,若a begin 大於key,說明 a begin 的位置應該是...

js快速排序正確的寫法

前端小白一枚,學習js的時間不長,這裡想說一說關於快速排序法的 的正確寫法,網上有很多,我只能說有些事不夠準確的,沒有考慮到陣列裡面重複出現元素的情況,請看看正確的 顯示 快速排序法 function quicksort array var left var right var middleinde...