数据结构基础---排序

281 阅读5分钟

一、排序

1.1.基本概念

  • 将一组杂乱无章的数据按一定的规律次序排列起来

  • 目的:便于查找

  • 排序算法的好坏如何衡量?

    • 时间效率——排序速度
    • 空间效率——占内存辅助空间的大小
    • 稳定性——若两个记录A和B的关键字值相等,但排序后A、B的先后次序保持不变,则称这种排序算法是稳定的
  • 排序是否空间占用方式:

    • 内部排序:指待排序记录全部存放在内存中排序的过程
    • 外部排序:指待排序记录的数量很大,以至内存不能容纳全部记录,在排序过程中尚需对外存进行访问的过程

二、插入排序

2.1.基本概念

  • 每步将一个待排序的对象,按其关键码大小,插入到前面已经排好序的一组对象的适当位置上,直到对象全部插入为止
  • 插入排序有多种具体实现算法:
    • 直接插入排序
    • 希尔排序

2.2.直接插入排序

  • 先将序列中第1个记录看成一个有序的子序列,然后从第2个记录开始,逐行进行插入,直至整个序列有序,排序过程为n-1趟插入

  • 时间效率:因为在最坏情况下,所有元素的比较次数总和为(0+1+...+n-1)->O(n2)。故时间复杂度为O(n2)

  • 空间效率:仅占用一个缓冲单元—O(1)

  • 算法的稳定性:稳定

2.3.希尔排序

  • 先取一个正整数d1<n,把所有相隔d1的记录放到一组,组内进行直接插入排序;然后取d2<d1,重复上述分组和排序操作;直至di=1,即所有记录放进一个组中排序为止

  • 希尔排序是一种不稳定的排序算法,初始序列不同会影响算法的效率

三、选择排序

3.1.基本概念

  • 每一次从待排序的数据元素中选出最小的一个元素,存放在已排序列的后面,直到全部待排序的数据元素排完
  • 优点:实现简单
  • 缺点:每趟只能确定一个元素,表长为n时需要n-1趟
  • 前提:顺序存储结构
  • 选择排序分为:
    • 直接选择排序
    • 堆排序

3.2.直接选择排序

  • 在所有记录中选出最小的记录,把它与第1个记录交换,然后再剩余的记录内选出最小的记录与第2个交换...依次类推。

3.3.堆排序

  • 堆:满足下列性质的数列{r1, r2, ... , rn}

    • ri <= r2i,ri <= (r2i)+1 小顶堆
    • 或 ri >= r2i,ri >= r(2i)+1 大顶堆
  • 堆排序就是利用堆的特性对记录序列进行排序的一种排序方法;将无序序列建成一个堆,得到关键字最小(或最大)的记录;输出堆顶的最小(大)值后,使剩余的n-1个元素又建成一个堆,则可得到n个元素的次小值;重复执行,得到一个有序序列,这个过程叫作堆排序

  • 输出堆顶元素之后,以堆中最后一个元素替代之;然后将根结点值与左、右子树的根结点值进行比较,并与其中小者进行交换;重复上述操作,直至叶子结点,将得到新的堆,称这个从堆顶至叶子的调整过程为“筛选”

  • 堆排序的最坏时间复杂度为O(nlog2n),堆排序的平均性能接近最坏性能

  • 堆排序的辅助空间为o(1)

四、交换排序

4.1.基本概念

  • 交换排序的基本思想时两两比较待排序记录的关键码,如果发生逆序(排列顺序与排序后的次序相反),则交换之,直到所有记录都排好序为止
  • 交换排序的主要算法有:
    • 冒泡排序
    • 快速排序

4.2.冒泡排序

  • 基本思路:每趟不断将记录两两比较,并按“前小后大”(或“前大后小”)规则交换

    • 第一趟:第1个与第2个比较,大则交换;第2个与第3个比较,大则交换,...关键字最大的记录交换到最后一个位置上
    • 第二趟:对前n-1个记录进行同样的操作,关键字次大的记录交换到第n-1个位置上
    • 依次类推,则完成排序
  • 最好情况:初始排列已经有序,只执行一趟起泡,做n-1次关键码比较,不移动对象

  • 最坏情形:初始排列逆序,要执行n-1趟起泡

  • 时间效率:O(n2)因为要考虑最坏情况

  • 空间效率:O(1)只在交换时用到一个缓冲单元

  • 稳定性:稳定,因为25和25*在排序前后的次序未改变

4.3.快速排序

  • 从待排序列中任取一个元素(例如取第一个)作为中心,所有比它小(或相等)的元素一律放前,所有比它大的元素一律放后,形成左右两个子表;然后再对各子表重新选择中心元素并按此规则调整,直到每个子表的元素只剩一个。此时便为有序序列了。

  • 优点:因为每趟可以确定不止一个元素的位置,而且呈指数增加,所以特别快

  • 前提:顺序存储结构

  • 若待排记录的初始状态为按关键字有序时,快速排序将蜕化为冒泡排序,最坏时间复杂度为O(n2),最好时间复杂度为O(nlog2n)

  • 快速排序是一种不稳定的排序方法

五、归并排序

5.1.基本概念

  • 可以把一个长度为n的无序序列看成是n个长度为1的有序子序列,首先做两两归并,得到n/2个长度为2的有序子序列;再做两两归并,...,如此重复,直到最后得到一个长度为n的有序序列

5.2.归并排序

  • 时间效率:O(nlog2n)
  • 空间效率:O(n)
  • 稳定性:稳定