面試中較為常見的演算法之一就是快速排序,快速排序在實際排序應用中也是最好的選擇,因為它的平均效能非常好,它的期望複雜度為nlgn,另外,它還是一種穩定的排序方法。快速排序利用分治思想,將待排序陣列分成左右兩個部分,然後對其分別遞迴呼叫快速排序演算法。
下面通過乙個例子介紹快速排序演算法的思想,假設要對陣列a[10]=進行排序,首先要在陣列中選擇乙個數作為基準值,這個數可以隨意選擇,在這裡,我們選擇陣列的第乙個元素a[0]=6作為基準值,接下來,我們需要把陣列中小於6的數放在左邊,大於6的數放在右邊,怎麼實現呢?
我們設定兩個「哨兵」,記為「哨兵i」和「哨兵j」,他們分別指向陣列的第乙個元素和最後乙個元素,即i=0,j=9。首先哨兵j開始出動,哨兵j一步一步地向左挪動(即j–),直到找到乙個小於6的數停下來。接下來哨兵i再一步一步向右挪動(即i++),直到找到乙個數大於6的數停下來。
最後哨兵j停在了數字5面前,哨兵i停在了數字7面前。此時就需要交換i和j指向的元素的值。交換之後的陣列變為a[10]=:第一次交換至此結束。接下來,由於哨兵i和哨兵j還沒有相遇,於是哨兵j繼續向前,發現比6小的4之後停下;哨兵i繼續向前,發現比6大的9之後停下,兩者再進行交換。交換之後的陣列變為a[10]=。第二次交換至此結束。接下來,哨兵j繼續向前,發小比6小的3停下來;哨兵i繼續向前,發現i==j了!!!於是,這一輪的探測就要結束了,此時交換a[i]與基準的值,陣列a就以6為分界線,分成了小於6和大於6的左右兩部分:a[10]=。至此,第一輪快速排序完全結束,接下來,對於6左邊的半部分3,1,2,5,4,執行以上過程;對於6右邊的半部分9,7,10,8,執行以上過程,直到不可拆分出新的子串行為止。最終將會得到這樣的序列:1 2 3 4 5 6 7 8 9 10,到此,排序完全結束。#includevoid quicksort(int array, int low, int high)
//將基準temp放於自己的位置,(第i個位置)
swap(array[low], array[i]);
quicksort(array, low, i - 1);
quicksort(array, i + 1, high);
}int main()
;quicksort(a, 0, 7);
for(int i = 0; i < 8; i++)
return 0;
}
排序演算法之快速排序
快速排序使用分治法 divide and conquer 策略來把乙個序列 list 分為兩個子串行 sub lists 步驟為 從數列中挑出乙個元素,稱為 基準 pivot 重新排序數列,所有元素比基準值小的擺放在基準前面,所有元素比基準值大的擺在基準的後面 相同的數可以到任一邊 在這個分割槽退出...
排序演算法之快速排序
快速排序入口 public void quicksort int lists 遞迴呼叫該函式。原理 每次從陣列從選乙個標兵 本實現為簡單起見直接選取給定範圍內的第乙個元素為標兵 讓後在給定範圍內進行雙向遍歷,目的是以標兵為分界線,將所有小於標兵值的數字排一邊,將所有大於標兵的數字 放到另一邊。標兵移...
排序演算法之快速排序
快速排序是一種不穩定的排序演算法,它的基本思想是,以某個元素為基準,將所有大於等於它的值放在右邊,小於它的值放在左邊,這樣陣列就被分為兩部分,遞迴對這兩部分進行快速排序,而單個元素我們認為是已經排好序的。這是一種歸併思想,當然在最後一步,合併,我們什麼也沒有做也不用做。每一次排序都有乙個元素被放在正...