1. 程式人生 > >C++資料結構 6 快速排序

C++資料結構 6 快速排序

快速排序演算法是最快的演算法,也是最受歡迎的演算法。

快速排序採用的是分治法,其平均時間複雜度為O(nlogn)

一趟快速排序的演算法是[1]:

  1)設定兩個變數I、J,排序開始的時候:I=0,J=N-1;   2)以第一個陣列元素作為關鍵資料,賦值給key,即 key=A[0];   3)從J開始向前搜尋,即由後開始向前搜尋(J=J-1即J--),找到第一個小於key的值A[j],A[j]與A[i]交換;   4)從I開始向後搜尋,即由前開始向後搜尋(I=I+1即I++),找到第一個大於key的A[i],A[i]與A[j]交換;

  5)重複第3、4、5步,直到 I=J; (3,4步是在程式中沒找到時候j=j-1,i=i+1,直至找到為止。找到並交換的時候i, j指標位置不變。另外當i=j這過程一定正好是i+或j-完成的最後另迴圈結束。)

下面是快速排序的程式碼:

#include <iostream>

using namespace std;

template<class T>    //使用C++函式模板類
void QuickSort(T *a,const int left,const int right)
{
    //快速排序:建立一個基準,所有的元素和基準進行比較,比基準大的放右邊,比基準小的放左邊
    //基準可以選最左邊的數或者最右邊的數,之後依次對左右兩邊的數進行遞迴排序
    if(left<right)
    {
    int i=left;
    int j=right+1;  //加一?小技巧可以使後面的比較變得簡單
    int privot=a[left];   //選取左邊的元素作為基準
    do{
        do i++; while(privot>a[i]);  //左邊依次往右遞增,直到遇到比基準大的數停止
        do j--; while(privot<a[j]);   //右邊的依次往左遞減,直到遇到比基準小的數停止
        if(i<=j) swap(a[i],a[j]);   //在兩個數沒有交叉時,大的數放右邊,小的數放左邊 ,交換
    }while(i<j);
    swap(a[left],a[j]);  //這一步不要忘了,此時結束迴圈a[j]的數比基準小,與基準交換
    QuickSort(a,left,j-1);   //對左邊的數進行遞迴
    QuickSort(a,j+1, right);  //對右邊的數進行遞迴
    }
}
int main()
{
    int a[]={0,9,45,78,23,12,45,16,21,32,99}; //最後一個L數是最大的,不做排列使用
    QuickSort(a,0,10);
    for(int i=0;i<10;i++)
        cout<<a[i]<<endl;
     //cout << "Hello world!" << endl;
    return 0;
}