排序时间复杂度+快排的小改进

排序时间复杂度
排序方法平均情况最好情况最坏情况空间稳定性

冒泡排序

O(n^2)O(n)

O(n^2)

O(1)稳定

选择排序

O(n^2)O(n^2).

O(n^2)

O(1)不稳定

插入排序

O(n^2)O(n)

O(n^2)

O(1)稳定

希尔排序

O(nlogn)~O(n^2)O(n^1.3)

O(n^2)

O(1)不稳定

堆排序

O(nlogn)O(nlogn)O(nlogn)O(1)不稳定

归并排序

O(nlogn)O(nlogn)O(nlogn)O(1)稳定

快速排序

O(n^2)O(nlogn)

O(n^2)

O(1)不稳定

快速排序和堆排序:

堆排序每次取一个最大值的时候,会把堆底部的X提上来,然后重新调整成一个堆。而X有很大可能是依旧调整到堆的底部(堆的底部X显然是比较小的数,才会在底部),然后再次和堆顶最大值交换,再调整下来,可以说堆排序做了许多无用功。

总结起来就是,快排的最坏时间虽然复杂度高,但是在统计意义上,这种数据出现的概率极小,而堆排序过程里的交换跟快排过程里的交换虽然都是常量时间,但是常量时间差很多。

选择排序改进: 

void qSort(int *data, int begin, int end){
    int pivot, i, j;
    if(begin>=end)
        return;
    i = begin;
    j = end;
    pivot = data[i];
    while(i<j){
        while(i<j && data[j]>=pivot)
            j--;
        data[i] = data[j];
        while(i<j && data[i]<=pivot)
            i++;
        data[j] = data[i];
    }
    data[i] = pivot;
    qSort(data, begin, i-1);
    qSort(data, i+1, end);
}

 

1.对于大规模数据来说,前期采用的快速排序已经将一些元素放到了正确的位置上,因此当规模降低到一定程度时,可以认为一些元素已经基本有序了。对基本有序的序列进行排序,插入排序是最好的选择,不光比较次数少,还免去了递归调用的过程。

2.中轴元素的选取。如果简单的只是选择第一个或最后一个作为中轴元素,这样当待排序序列基本有序的时候,它就退化为O(n^2)的时间复杂度。因此,第二中改进方法为:

可以取最左边、最右边、中间这三个位置的元素中的中间值作为中轴元素,来避免这种情况。

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值