面試中較爲常見的算法之一就是快速排序,快速排序在實際排序應用中也是最好的選擇,由於它的平均性能很是好,它的指望複雜度爲nlgn,另外,它仍是一種穩定的排序方法。快速排序利用分治思想,將待排序數組分紅左右兩個部分,而後對其分別遞歸調用快速排序算法。git
下面經過一個例子介紹快速排序算法的思想,假設要對數組a[10]={6,1,2,7,9,3,4,5,10,8}進行排序,首先要在數組中選擇一個數做爲基準值,這個數能夠隨意選擇,在這裏,咱們選擇數組的第一個元素a[0]=6做爲基準值,接下來,咱們須要把數組中小於6的數放在左邊,大於6的數放在右邊,怎麼實現呢?github
咱們設置兩個「哨兵」,記爲「哨兵i」和「哨兵j」,他們分別指向數組的第一個元素和最後一個元素,即i=0,j=9。首先哨兵j開始出動,哨兵j一步一步地向左挪動(即j–),直到找到一個小於6的數停下來。接下來哨兵i再一步一步向右挪動(即i++),直到找到一個數大於6的數停下來。面試
最後哨兵j停在了數字5面前,哨兵i停在了數字7面前。此時就須要交換i和j指向的元素的值。算法
交換以後的數組變爲a[10]={6,1,2,5,9,3,4,7,10,8}:數組
第一次交換至此結束。接下來,因爲哨兵i和哨兵j尚未相遇,因而哨兵j繼續向前,發現比6小的4以後停下;哨兵i繼續向前,發現比6大的9以後停下,二者再進行交換。交換以後的數組變爲a[10]={6,1,2,5,4,3,9,7,10,8}。性能
第二次交換至此結束。接下來,哨兵j繼續向前,發小比6小的3停下來;哨兵i繼續向前,發現i==j了!!!因而,這一輪的探測就要結束了,此時交換a[i]與基準的值,數組a就以6爲分界線,分紅了小於6和大於6的左右兩部分:a[10]={3,1,2,5,4,6,9,7,10,8}。ui
至此,第一輪快速排序徹底結束,接下來,對於6左邊的半部分3,1,2,5,4,執行以上過程;對於6右邊的半部分9,7,10,8,執行以上過程,直到不可拆分出新的子序列爲止。最終將會獲得這樣的序列:1 2 3 4 5 6 7 8 9 10,到此,排序徹底結束。code
下面給出快速排序的實現,也能夠訪問個人github下載源代碼:排序
#include <stdio.h> void QuickSort(int array[], int low, int high) { int i = low; int j = high; if(i > j) return; int temp = array[low]; while(i != j) { while(array[j] >= temp && i < j) j--; while(array[i] <= temp && i < j) i++; if(i < j) swap(array[i], array[j]); } //將基準temp放於本身的位置,(第i個位置) swap(array[low], array[i]); QuickSort(array, low, i - 1); QuickSort(array, i + 1, high); } int main() { int a[8] = {1,4,7,2,3,6,5,8}; QuickSort(a, 0, 7); for(int i = 0; i < 8; i++) { printf("%d\n",a[i]); } return 0; }