排序演算法之 快速排序

2021-08-03 14:31:50 字數 1168 閱讀 4451

在面試阿里和華為實習生的時候,都被問到快速排序的問題,看來軟體崗面試官對這個問題十分重視,因此特別在此剖析。

思路:快速排序使用分治法,將問題的規模減小,然後再分別進行處理。從原序列中選擇乙個主元,將比主元大的元素從右向左放置,而比主元小的元素,從左向右放置。

通俗來講,就是,找乙個基準主元,比主元小的元素放在左邊,比主元大的元素放在右邊,主元放在中間。形成了三個新的數列,左邊的數列,中間乙個主元,和右邊的序列。只有左邊和右邊序列都排序好了,那麼整體也是從小到大有序的了。因此,以此方法,遞迴左右序列就可以了。

具體步驟:

1)選擇乙個主元,並與最後乙個元素交換。//與最後乙個元素交換的目的,是為了後面把主元放到中間適當位置

2)設定兩個指標low和high,初值分別指向第乙個和倒數第二個元素。//因為最後乙個元素已經和主元交換了,所以不用考慮

3)low從左向右掃瞄,若遇到比主元大的元素則停止;然後high從右往左掃瞄,若遇到比主元小的元素則停止。

4)若low和high沒有錯位(即low5)重複3、4直至low和high錯位,將基準與a[low]兌換位置。這就完成了一次劃分,以主元為邊界分別劃分成大於和小余主元的兩個子串行。

6)遞迴地對兩個子串行用同樣的方法進行排序。

**如下:

median3函式三次交換實現a[left]<=a[center]<=a[right],並將基準pivot藏到右邊

char median3(string &a, int left ,int right)

void insertionsort(string &a, int n)

a[i] = tmp;

} //依次與已排序序列中元素比較並右移。

/*放進合適的位置*/ }

void qsort(string &a, int left, int right){//核心遞迴函式

int pivot,cutoff=10,low,high;

if(cutoff <= right - left){

pivot = median3(a, left,right);

low = left;high = right - 1;

while(1){

while(a[++low]pivot);

if(low

排序演算法之快速排序

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

排序演算法之快速排序

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

排序演算法之快速排序

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