本文图片出处:菜鸟教程 python3实例, 中国大学MOOC——电子科技大学数据结构与算法课程
〇、简介
1. 稳定性
[3,4,8,5,3,6] 排序后:
[3,3,4,5,6,8] 稳定排序
[3,3,4,5,6,8] 不稳定排序(两个3的相对位置发生改变)
2. 内部排序和外部排序
内部排序:不需要访问外存即可完成排序
外部排序:参加排序的记录数量很大,整个序列的排序过程不可能在内存中完成
3. 内部排序的方法
序列分为有序序列区和无序序列区,逐渐增大有序序列区,减小无序序列区,直至排序完成。
一、插入排序
1. 简单插入排序
共n-1轮
时间复杂度:O(N)-O(N2) 平均为O(N2)
空间复杂度:O(1)
稳定性:稳定(temp < l[j-1]才满足,相等的时候不交换位置)
复杂性:简单
特点:用直接插入排序,原序列越接近有序序列(逆序的个数越少),比较次数越少
l = [5,3,87,4,12,54,8,5,66]
def insertSort(l):
for i in range(1, len(l)): #从下标1的元素开始排序,默认temp前的子序列是已排序完毕的
temp = l[i] #哨兵,临时存放未排序序列的第一个元素
j = i
while j>0 and temp < l[j-1]: #当已排序子列表的最后一个元素比temp要大,
#那么就把这个元素后移一位,然后指针前移,下一次循环temp和前一个元素比较大小
#并且指针最小到下标1,到下标0的时候j-1就变成了-1了
l[j] = l[j-1] #元素后移
j -= 1 #指针前移
l[j] = temp #循环结束,当前指针所在位置即为temp的位置,此时当前元素排序完毕
return l
insertSort(l)
2. 希尔排序
简单插入排序的升级版
适合应用于几千几万个数值的排序(中等大小排序)
时间复杂度:O(NlogN)~O(N2)
空间复杂度:O(1)
稳定性:不稳定
复杂性:复杂
希尔排序(Shell Sort)是插入排序的一种。也称缩小增量排序,是直接插入排序算法的一种更高效的改进版本,该方法的基本思想是:先将整个待排元素序列分割成若干个子序列(由相隔某个“增量”的元素组成的)分别进行直接插入排序,然后依次缩减增量再进行排序,待整个序列中的元素基本有序(增量足够小)时,再对全体元素进行一次直接插入排序。因为直接插入排序在元素基本有序的情况下(接近最好情况),效率是很高的,因此希尔排序在时间效率比直接插入排序有较大提高。