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


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碰面的位置。基准数的位置与碰面位置上的数交换。之后对于基准数两侧的数重复做改操作。递归!

 

点赞