快速排序

1)时间复杂度
最差情况下时间复杂度
        最差的情况就是每一次取到的元素就是数组中最小/最大的,这种情况其实就是冒泡排序了(每一次都排好一个元素的顺序)
     这种情况时间复杂度就好计算了,就是冒泡排序的时间复杂度:T[n] = n * (n-1) = n^2 + n;
     综上所述:快速排序最差的情况下时间复杂度为:O( n^2 )

平均时间复杂度
       快速排序的平均时间复杂度也是:O(nlogn)

(2)空间复杂度
        其实这个空间复杂度不太好计算,因为有的人使用的是非就地排序,那样就不好计算了(因为有的人用到了辅助数组,所以这就要计算到你的元素个数了);我就分析下就地快速排序的空间复杂度吧;
        首先就地快速排序使用的空间是O(1)的,也就是个常数级;而真正消耗空间的就是递归调用了,因为每次递归就要保持一些数据;
     最优的情况下空间复杂度为:O(logn)  ;每一次都平分数组的情况
     最差的情况下空间复杂度为:O( n )      ;退化为冒泡排序的情况


注意点:
(1)递归调用的区间:[l,pivot-1],[pivot+1,r]
(2)加上等于号,可以排序有重复值的数组
        A[low]<=key  A[high]>=key   



int partition(int A[], int low, int high)
{
    int key = A[low];  //key是基准
    while (low != high)  //当low==high时,退出while循环
    {
        while (low<high&&A[high]>=key) high--;   //当low=high时,退出while
        A[low]=A[high];

        while (low<high&&A[low]<=key) low++;
        A[high] = A[low];
    }
    A[low] = key;
    return low;
}

void QSort(int A[], int l,int r)
{
    if (l < r)
    {
        int pivot = partition(A, l, r);
        QSort(A, l, pivot-1);
        QSort(A, pivot + 1, r);
    }
}



int main()
{
    int A[] = { 12,10,2,4,5,4,5};
    int len = sizeof(A) / sizeof(A[0]) ;

    QSort(A, 0, len - 1);
    for (int i = 0; i < len; i++)
        printf("%5d", A[i]);
    printf("\n");
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值