zoukankan      html  css  js  c++  java
  • 十大排序

    比较排序:

    冒泡:两两交换

    选择:选择末序列最大(最小)值,同对应位置交换

    插入:从后往前扫描有序序列

    希尔排序:又叫做缩小增量排序,希尔增量:n/2 n/4   ... 1,O(n^2),Hibbard增量:1,3,7,2hk-1,O(n^1.5);下界为O(nlog(2n))

    非比较排序:

    桶排序:N个待排数据,M个桶,平均每个桶[N/M]个数据的桶排序平均时间复杂度为:O(N)+O(M*(N/M)*log(N/M))=O(N+N*(logN-logM))=O(N+N*logN-N*logM)

        即:平均时间复杂度为线性的O(N+C),其中C=N*(logN-logM)。如果相对于同样的N,桶数量M越大,其效率越高,最好时间复杂度达到O(N)。当然桶排序的空间复杂度为O(N+M),如果输入数据非常庞大,而桶的数量也非常多,则空间代价无疑是昂贵的。此外,桶排序是稳定的。 

    基数排序:n个待排数据,d个关键码,关键码取值范围radix,则时间复杂度:O(d*(n+radix))

    总结

    冒泡排序是基础,每轮遍历将“最大元素”移至正确位置(“最右边”),不稳定的O(n^2);

    选择排序要了解,选择排序每轮遍历将“最小(大)元素”移至正确位置(“最左(右)边”),稳定的O(n^2);

    插入排序最简单,适合数据量较小的排序,依然是O(n^2);

    希尔排序是插入排序升级版,不好用,为O(nlog^2n);

    归并排序和快速排序要熟记原理并会写代码。时间复杂度都是O(nlogn),前者不稳定,后者稳定。最常用的排序方法。

    堆排序代码复杂,不太好理解,也不好用,为O(nlogn)。

    计数排序、桶排序、基数排序都不是比较排序,可以归为一类,对数据有特殊的要求。其中计数排序是基础,类似建立map对应;桶排序将数据的大小分到不同的桶中,桶内再微小排序;基数排序则是多次的桶排序,每次桶排序根据对应数位将数据分到不同桶中。

    转载自:https://www.cnblogs.com/AlvinZH/p/8677814.html

  • 相关阅读:
    [NOI Online #3 提高组]
    Luogu P3491 [POI2009]SLW-Words
    AtCoder Grand Contest 043
    Luogu P5607 [Ynoi2013]无力回天NOI2017
    AtCoder Grand Contest 041
    Luogu P5070 [Ynoi2015]即便看不到未来
    BZOJ 4367: [IOI2014]holiday假期
    BZOJ 3571: [Hnoi2014]画框
    BZOJ 4456: [Zjoi2016]旅行者
    BZOJ 1111: [POI2007]四进制的天平Wag
  • 原文地址:https://www.cnblogs.com/yvlian/p/11382101.html
Copyright © 2011-2022 走看看