1. 程式人生 > >快速排序詳解C++

快速排序詳解C++

        題目:將亂序陣列按從小到大排列。陣列中是允許出現重複數字的。

        思路挺簡單:

        (1) 在陣列中找個基準值(一般取開頭/中間/結尾的數值),以該基準值為界限,將小於基準值的數放在基準值左邊,大於基準值的值放在基準值右邊。

        (2) 基準值左邊使用(1)中的方法,遞迴執行多次後,可以將左邊排好。

        (3) 基準值右邊也一樣,使用(1)中的方法,遞迴執行多次後,可以將右邊排好。

        程式碼:

#include <stdio.h>
#include <iostream>

/* 取陣列最後一位為基準,構建一個新陣列,新陣列左邊小於基準,新陣列右邊大於基準 */
int separater(int array[], int begin, int LastSubscript)   //陣列、陣列起始地址、陣列最大下標
{
    int key = array[LastSubscript];
    int leftpart = begin -1;
    for(int i = begin; i < LastSubscript; i++)
    {
        if(array[i] <= key)
        {
            leftpart++;
            std::swap(array[leftpart],array[i]);
        }
    }
    std::swap(array[leftpart+1], array[LastSubscript]);
    return (leftpart+1);
}
/* 即是上述“思路”的(2)、(3)步 */
void quicksort(int array[], int begin, int LastSubscript)
{
    int position = 0;
    if(begin < LastSubscript)
    {
        position = separater(array, begin, LastSubscript);
        quicksort(array, begin,position - 1);               //基準值左邊遞迴
        quicksort(array, position + 1, LastSubscript);      //基準值右邊遞迴
    }
}

/* 結果符合從小到大排序要求 */
int main(int argc, char *argv[])
{
    int array[] = {8,5,6,3,1,9,4,4};
    quicksort(array, 0, 7);
    for(int i = 0; i < 8; i++)
    {
        printf("array[%d] is %d:\n", i, array[i]);
    }
}

        快排演算法到此介紹結束。演算法學習並不是完全為了面試,對程式設計師的編碼能力提升也是很大的,近期將不斷學習和分享一些演算法部落格,現有需求的朋友歡迎檢視博主“演算法分類”中相關內容。