YLLEN

要去看埃菲尔铁塔的顶

欢迎关注本人微博:t.cn/RGSLVUk

快速排序

      快速排序

以给定分割点为基准,使得左边的都小于基准 ,右边的都大于基准

再将左边选出一个基准,然后再细分,使得左边都小于,右边都大于基准,

然后再.......... 这样左边就好了,然后右边就好了

然后右边就好了.....

然后整体就好了。

比如 1 4 7 8 5 1 2 6 5 47  2

假定7    为基准,

1 4 7 8 5 1 2 6 5 47  2

一次排序后  7会被2换掉

1 4 2 8 5 1 2 6 5 47 2

这时 左边游标会到8

然后将8和最后那个2交换

1 4 2 8 5 1 2 6 5 47 8

继续交换

      2 5     6    12     8  

1 4 7 8 5 12 6 5 47 2

最终会将 key( 7 )写入那个 6的位置 

一次排序后为

1 4 2 5 5 6 7 12 47 8




void Qsort(int n[],int low,int high)
{
    if (low > high)
            return;
                    /*记录下标*/
    int f = low;
    int l = high;
    int key = n[f];    //分割点

    while (f < l)
    {
        while (n[l] >= key && f < l)        //    右边找出 小于分割点的
            l--;
        n[f] = n[l];                        //    找到后 把它换到低处
        while (n[f] <= key && f < l)        //    左边找出 大于分割点的
            f++;
        n[l] = n[f];                        //  找到后 把它换到高处
    }
        
        n[f] = key;            //这里肯定是 l == f 处,也就是key要放置的地方
        Qsort(n, low, f - 1);
        Qsort(n, l + 1, high);
}

评论

© YLLEN | Powered by LOFTER