6.1 插入排序
(1)直接插入排序
思想:先将序列中第一个记录看成一个有序子序列,从第二个记录开始,逐个进行插入,直至整个序列有序,共n-1趟插入
时间复杂度:
关键字比较次数n^2/4
关键字移动次数n^2/4
空间复杂度S(n) = O(1)
稳定的排序算法
(2)折半插入排序
思想:基于折半查找方法确定插入位置的排序,找到插入位置后,一起向后移动
时间复杂度T(n) = O(n^2)
空间复杂度S(n) = O(1)
希尔排序
思想:先取一个正整数d1<n,把所有相隔d1的记录放在一组,组内进行直接插入排序;然后去d2<d1,重复上述分组和排序操作,直至di=1,即将所有的记录放在一个组中
不稳定的排序方法
6.2 交换排序
6.2.1 起泡排序
将第一个记录的关键字与第二个记录的关键字进行比较,若为逆序,则交换,然后比较第二个与第三个记录,以此类推,直至第n-1个记录与第n个记录比较为止。
对前n-1个记录进行第二趟气泡排序,结果是关键字次大的记录安置在第n-1个记录位置
重复上述步骤,直到在一趟排序过程中没有进行过交换记录的操作。
比较次数1/2(n^2-n)
移动次数3/2(n^2-n)
空间复杂度S(n) = O(1)
稳定的排序算法
适用于元素按较少,或初始基本有序
6.2.2 快速排序
(1)选择好的边界值(可以选择中间值)
(2)扫描数组,将小于等于边界值的元素放在子数组1中,将大于边界值的元素放在子数组2中
比较次数
较好情况下(总是选择中间值作为边界值)n(logn+1)
最坏情况下T(n) = O(n^2)
空间复杂度,需要栈来实现递归
最坏S(n) = O(n)
一般S(n) = O(log2(n))
不稳定的排序方法
不适合对小规模数据进行排序
6.3 选择排序
6.3.1 简单选择排序
6.3.2 堆排序
由无序序列建立堆
输出对顶元素后,调整剩余元素,生成新的堆
6.4 归并排序
思想:2-路归并排序
假设初始化序列含n个记录,看成含有n个有序的子序列,每个子序列长度为1
两两合并,得到有序子序列
再两两合并,知道得到一个长度为n的有序序列为止