-
直接插入排序
类似整理扑克牌的过程,将之后待排序的关键字插入到之前已经排序完成的序列中
特点:边插入边排序,保证子序列随时都是排好序的def InsertSort(array): length = len(array) for i in range(1, length): j = i - 1 x = array[i] # 为方便循环条件,可以采用哨兵位 while (j >= 0 and array[j] > x): array[j + 1] = array[j] j -= 1 array[j + 1] = x return array
直接插入法的性能:
最好情况下是待插入序列已经是排好序的,之后直接在尾端插入即可,并且不需要进行数据元素的移动
时间复杂度即为比较的次数 n-1次,首个元素直接选定,所以时间复杂度为o(n)最坏情况下是待插入序列是逆序的,寻找插入位置需要遍历前面所有的元素,移动元素也需要将前面所有的元素都后移;第二个元素插入位置需要比较1次,然后向后移动一个元素;第三个元素插入位置需要比较2次,然后之前的元素都需要向后移动,所以时间复杂度为o(比较)+o(移动) n(n-1)/2 + n(n-1)/2 所以时间复杂度为o(n^2) 平均时间复杂度为o(n^2) 直接插入排序算法为一种稳定的排序算法(注意排序的稳定性不是算法优劣性的衡量标准)
-
折半插入排序
折半插入排序和直接插入排序的移动元素思想是一致的,主要区别在于比较的方式即寻找元素插入位置的方式,折半插入排序采用二分查找的方式,而直接插入排序采用顺序查找的方式;def BinInsertSort(array): length = len(array) for i in range(1, length): x = array[i] low = 0 high = i - 1 while (low <= high): mid = (low + high) // 2 if array[mid] > x: high = mid - 1 else: low = mid + 1 j = i - 1 while (j >= (high + 1)): array[j + 1] = array[j] j -= 1 array[high+1] = x return array
折半插入排序的性能:
比较的效率提高了,但是移动的次数并没有改变,时间复杂度仍然为o(n^2),也是一种稳定的排序算法,关键字大小相同的元素相对位置并未发生改变; -
希尔排序
希尔排序的思想在于扩大移动的步上,使得一次移动后比较接近其最终位置;该排序算法使用了增量序列,针对每一个序列值,进行直接插入排序,最后的增量序列必须为1,通过直接插入排序法使得相对有序的序列成为有序序列;def ShellSort(array, series): for k in series: ShellInsertSort(array, k) return array def ShellInsertSort(array, k): for i in range(k, len(array)): x = array[i] j = i - k while (j >= 0 and array[j] > x): array[j + k] = array[j] j -= k array[j + k] = x
希尔排序是一种不稳定的排序算法;
插入排序
最新推荐文章于 2024-10-10 23:12:18 发布