算法初探——快速排序

快速排序由C. A. R. Hoare在1962年提出。它的基本思想是:通過一趟排序將要排序的數據分割成獨立的兩部分,其中一部分的所有數據都比另外一部分的所有數據都要小,然後再按此方法對這兩部分數據分別進行快速排序,整個排序過程可以遞歸進行,以此達到整個數據變成有序序列。

基本思想
①先從數列中取出一個數作爲基準數;
②分區過程,將比這個數大的數全部放到它的右邊,小於等於它的數放到它的左邊;
③再次對左右區間重複步驟②,直到各個區域僅一個有數;

似乎理解起來不太容易爲什麼最後會是有序的?

假設有如下一個無序的數組排列
這裏寫圖片描述

這裏寫圖片描述
簡稱挖坑填數
①這裏選取基準數有很多種選法,我們就以選取第一個數據元素做爲基準數,先把這個“蘿蔔”出來找個箱子裝起來,並設置搜索的左右邊界L和R。
②從R處起,從右向左找到第一個比基準數小的“蘿蔔”,如果此時R>L,則放到基準數的坑處,L++;
③從L起,從左向左找到第一個比基準數大的,如果此時R>L,則放到剛纔取出“蘿蔔”的坑處,並R–;
若此時L小於R則,繼續重複上述步驟②和步驟③;
這裏寫圖片描述
否則對左右部分分別遞歸,直到左右部分都只有一個數。

#include <iostream>

using namespace std;

int main()
{
    void quick_sort(int s[], int l, int r);
    int a[10] = { 1, 8, 7, 5, 4, 3, 6, 7, 10, 8 };
    for (int i = 0; i < 10; i++)
    {
        cout << a[i] << ' ';
    }
    cout << endl;
    quick_sort(a, 0, 9);
    for (int j = 0; j < 10; j++)
    {
        cout << a[j] << ' ';
    }
    cout << endl;
    cin.get();
    return 0;
}

void quick_sort(int s[], int l, int r)
{
    if (l<r)
    {
        int i = l, j = r, x = s[l];  //x的取值有不同取法    
        while (i<j)
        {
            while (i<j&&s[j]>x)
                j--;
                if (i<j)
                {
                    s[i++] = s[j];

                }
                while (i < j&&s[i] < x)     //從左向右找第一個大於等於x的數
                    i++;
                if (i<j)
                {
                    s[j--] = s[i];
                }
                s[i] = x;
            }
            quick_sort(s, l, i - 1);
            quick_sort(s, i + 1, r);
    }

}

運行結果
這裏寫圖片描述

發佈了44 篇原創文章 · 獲贊 25 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章