0%

5.排序

简单排序

冒泡排序

  • 不断向下(向上)比较相邻两个位置,如果顺序不对,则交换位置

  • 从而可以找到每一趟的最小值,并放在最下方

插入排序

​ 和打扑克抓牌一样,通过比较找到位置,移出空位,插入

简单选择排序

​ 选出最小或最大的然后交换位置

希尔排序

  • 每一趟以不同间隔进行选择排序

  • 定义增量序列 DM > DM-1 > … > D1 = 1

  • 对每个 Dk 进行“Dk-间隔”排序( k = M, M-1, … 1 )

  • 高效的增量序列

    • Hibbard 增量序列 Dk = 2k – 1
    • Sedgewick增量序列 94i–92i+1或 4i–3*2i+1

堆排序

生成最大堆,把堆顶元素和最后一个元素进行交换,对去掉一个最后元素(最大值本来就该在最后面)的新堆进行调整,再交换,再去元,再调整,周而复始,直到堆只剩一个元素。排序结束

归并排序

  • 核心:两个有序子序列不断的归并

  • 开辟临时数组,序列两两归并(若多出一序列,并入最后一个合成序列)放入临时数组,序列长度2,周而复始,直到序列长度大于数组。其中为节省空间,临时数组可以用一个临时数组与原数组进行来回倒。

快速排序

  • 选主元抽样(一般是头中尾)取中位数

  • 根据元素相对主元的大小,将集合分为两个集合

  • 不断进行集合拆分(递归),直到集合大小达到某一值时,对集合内的元素进行简单排序

表排序

  • 定义一个指针数组作为“表”,排指针即可,节省内存拷贝的时间。

  • 若非要进行内存排序,根据上一步的表,建“环”,根据环,进行内存位置调整,节省内存拷贝时间

基数排序(桶排序)

  • “建桶”,如果某些条件有序时,则元素有序。一种条件为一个过程,一种情况为一个桶。如1000以内的数有序,条件为百、十、个位数有序,情况为0-9。

  • 排序顺序

    • LSD(次位优先):条件重要性逆序
    • MSD(主位优先):条件的重要性顺序

排序方法比较

image-20210924140722408