前言:将一个数据元素(或记录)的任意序列,重新排列成一个按关键字有序的序列
思维导图:
目录
一、基本概念
1.定义
排序:将一个数据元素(或记录)的任意序列,重新排列成一个按关键字有序的序列。
内部排序:在排序期间数据对象全部存放在内存的排序。
外部排序:在排序期间全部对象个数太多,不能同时存放在内存,必须根据排序过程的要求,不断在内、外存之间移动的排序。
2.排序的基本操作
比较:比较两个关键字的大小。
移动:将记录从一个位置移动到另一个位置。
3.排序时间复杂度
排序的时间复杂度可用算法执行的记录关键字比较次数与记录移动次数来衡量。
4.排序方法的稳定性
如果在记录序列中有两个记录r[i]和r[j], 它们的关键字 key[i] == key[j] , 且在排序之前, 记录r[i]排在r[j]前面。如果在排序之后, 记录r[i]仍在记录r[j]的前面, 则称这个排序方法是稳定的, 否则称这个排序方法是不稳定的。
二、排序的类别
1.直接插入排序
稳定性:稳定
时间复杂度:
- 最优情况是正向排序 – O(n)
- 最差是逆向排序,每次插入都需要比较已完成数列元素的个数 – O(n^2)
空间复杂度:O(1)
过程:
注:可理解为打扑克整理牌的时候
2.希尔排序(缩小增量排序)
- 希尔排序是对直接插入排序的优化。
- 当gap > 1时都是预排序,目的是让数组更接近于有序。当gap == 1时,数组已经接近有序的了,这样就 会很快。这样整体而言,可以达到优化的效果。我们实现后可以进行性能测试的对比。
- 若待排记录序列为正序时,则时间复杂度可提到值O(n)。
- 稳定性:不稳定
过程:
•首先取一个整数 gap < n(待排序记录数) 作为间隔, 将全部记录分为 gap 个子序列, 所有距离为 gap 的记录放在同一个子序列中
•在每一个子序列中分别施行直接插入排序。
•然后缩小间隔 gap, 例如取 gap = gap/2
•重复上述的子序列划分和排序工作,直到最后取gap = 1, 将所有记录放在同一个序列中排序为止。

3.冒泡排序
- 时间复杂度:O(N^2)
- 空间复杂度:O(1)
- 稳定性:稳定
4.快速排序
- 时间复杂度:O(N*logN)
- 空间复杂度:O(logN)
- 稳定性:不稳定
过程:
•
一趟排序(某个子序列)过程
1.从high指向的记录开始,向前找到第一个关键字的值小于Pivotkey的记录,将其放到low指向的位置,low+1
2.从low