排序演算法之快速排序

2021-09-26 07:18:48 字數 1225 閱讀 7711

1 快排 遞迴 不穩定發生在基準元素與v[l]交換 需要partition三步走,一找二劃三遞迴

快排的步驟:

選乙個元素做基準

進行partition,就是把比基準小的放在基準的左邊,把比基準數大的放到右邊,劃分結束後基準元素位於中間(如何劃分看**,從後往前找和從前往後找)

對每個分割槽遞迴操作上述劃分函式,直至每個分序列大小為0或1(遞迴結束的條件)

面試中常問的:

快排為什麼快?

快排之所以快就是因為用到了分治法

解釋下冒泡跟快排的區別

還有快排不需要額外的輔助空間

快排的核心在**?

基準元素的選擇以及元素的移動,對於無序數列,通常我們選取第乙個或者最後乙個作為基準元素,對於有序的數列,那就成為最差的情況,所以應該隨機選取元素作為基準元素(或者選擇三數取中值,隨機選取三個數,選擇中間值作為基準,比如選開頭、結尾、中間三個數)

關於元素的移動有多種,**中講到的是一種

3. 快速排序的優化主要從以下幾個方面考慮:

優化基準選擇

優化小陣列排序效率

優化交換次數

優化遞迴

優化最差情況,避免糟糕分割槽

4. 對於很小的陣列(n<=20),快速排序不一定好。因為快速排序有遞迴開銷,可以考慮插入排序

vector<

int>

quicksort

(vector<

int>

&v,int low,

int high)

v[l]

= key;

//此時l=r

quicksort

(v, low, l -1)

;quicksort

(v, r +

1, high)

;//因為l=r,所以寫lr都可以

}}

?快速排序通常明顯比其他o(nlogn)演算法更快,因為它的內部迴圈可以在大部分的架構上很有效率地被實現出來。(這句話作者還難以理解)

?如果待排序的資料存在大量的重複元素,快排的效率應該不會太高,因為遇到重複時,比較和交換都是多餘的,所以重複元素越多,效能越差

?快排也可以通過非遞迴實現,那就是用棧,因為遞迴本身就是乙個函式棧,所以所有遞迴的問題都可以通過棧的方式代替,每進入新的方法相當於入棧,每次有方法返回相當於出棧(待補充)

排序演算法之快速排序

快速排序使用分治法 divide and conquer 策略來把乙個序列 list 分為兩個子串行 sub lists 步驟為 從數列中挑出乙個元素,稱為 基準 pivot 重新排序數列,所有元素比基準值小的擺放在基準前面,所有元素比基準值大的擺在基準的後面 相同的數可以到任一邊 在這個分割槽退出...

排序演算法之快速排序

快速排序入口 public void quicksort int lists 遞迴呼叫該函式。原理 每次從陣列從選乙個標兵 本實現為簡單起見直接選取給定範圍內的第乙個元素為標兵 讓後在給定範圍內進行雙向遍歷,目的是以標兵為分界線,將所有小於標兵值的數字排一邊,將所有大於標兵的數字 放到另一邊。標兵移...

排序演算法之快速排序

快速排序是一種不穩定的排序演算法,它的基本思想是,以某個元素為基準,將所有大於等於它的值放在右邊,小於它的值放在左邊,這樣陣列就被分為兩部分,遞迴對這兩部分進行快速排序,而單個元素我們認為是已經排好序的。這是一種歸併思想,當然在最後一步,合併,我們什麼也沒有做也不用做。每一次排序都有乙個元素被放在正...