【吭哧吭哧算法】快速排序



void FastSortHelper(vector<int>&a, int s, int t){
    if (t <= s) return;
    int k = a[s];
    int i = s; //start searching position
    int j = t; //end searching position
    while (i < j){
        int x;
        for (x = j; x >= s; x--){
            if (a[x] < k){
                j = x;
                break;
            }
        }
        for (x = i; x <= j; x++){
            if (a[x] > k){
                i = x;
                break;
            }
            if (x >= j){
                i = j;
                break;
            }
                
        }
        
        swapab(a[i], a[j]);
        
    }

    swapab(a[s], a[j]);

   
    FastSortHelper(a, j + 1, t);
    FastSortHelper(a, s, j - 1);
    
}
void FastSort(vector<int> &a){
    if (a.size() <= 1) return;
    FastSortHelper(a, 0, a.size() - 1);

桶排序在有限的數據範圍內複雜度是 n

冒泡排序是n方

快速排序最差情況的複雜度和冒泡一樣是n方,但是平均算法複雜度是nlogn

核心思想,快速排序不再像冒泡一樣一遍又一遍的遍歷,爲每個元素尋找最後的位置。快排會尋找一個基準數,比基準數小的放左邊,比基準數大的放右邊。

參考啊哈算法,對於初始序列“6 1 2 7 9 3 4 5 10 8”,6是基準數。小A從左往右找第一個大於6的數,小B從右往左找第一個小於6的數。然後AB交換所在位置的數字。每次B先找, A後找,直到AB碰面的位置。基準數的位置與碰面位置上的數交換。之後對於基準數兩側的數重複做改操作。遞歸!




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章