快速排序算法(容易理解)

面試中較爲常見的算法之一就是快速排序,快速排序在實際排序應用中也是最好的選擇,由於它的平均性能很是好,它的指望複雜度爲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;
}
相關文章
相關標籤/搜索