美文网首页
快速排序(C++实现)

快速排序(C++实现)

作者: 曲谐_ | 来源:发表于2017-10-15 23:52 被阅读0次

    快速排序步骤:

    • 首先,对于一个无序数组,开始时选取一个数(通常是首位)作为我们判断的依据。
    • 从尾端往前遍历,找出一个数小于我们的目标数,两者交换。
    • 从头端往后遍历,找出一个数大于我们的目标数,两者交换。
    • 重复上述步骤,直到目标数在最中间,左边的都是小于它的数,右边的都是大于它的数。(即i==j时结束)
    • 递归。在小于它的数中间继续重复排序。直至三个数排序排好。
    • 递归。在大于它的数中间继续重复排序。直至三个数排序排好。

    代码实现:

    #include<iostream>
    using namespace std;
    void Quicksort(int a[],int left,int right)
    {
        if(left < right)
        {
            int x = a[left];
            int i = left;
            int j = right;
            while(i < j)
            {
                while(i < j && a[j] > x)
                    j--;
                if(i < j)
                    a[i++] = a[j];
                while(i < j && a[i] < x)
                    i++;
                if(i < j)
                    a[j--] = a[i];
            }
            a[i] = x;
            Quicksort(a,left,i-1);
            Quicksort(a,i+1,right);
        }
    }
    int main()
    {
        int a[9] = {4,1,2,5,3,6,7,9,8};
        int len = sizeof(a)/sizeof(int);
        Quicksort(a,0,len-1);
        for(int i=0;i<len;i++)
            cout << a[i] << " ";
        return 0;
    }
    

    时间复杂度

    理论上分析一下:
    最坏情况:假设每一次最左边需要比较的元素在j--的过程中,一直都没有遇到比它小的元素,那么总共比较n-1次,第二轮则要n-2次,以此类推。。。(n-1)+(n-2)+...+1=1/2n^2。 时间复杂度为O(n^2)。
    最好情况:每次五五分,那么就类似二分查找一般的“二分排序”,总共递归次数只需要二叉树的深度logn,每次递归比较n次。时间复杂度为O(nlogn)。
    平均情况:O(nlogn)。证明过程略,太复杂记住即可。

    相关文章

      网友评论

          本文标题:快速排序(C++实现)

          本文链接:https://www.haomeiwen.com/subject/bvoxextx.html