直接插入排序
基本思想:
将数组中的待排序元素和前面排好序的元素做比较,如果选择的元素和已排序的元素小,就交换,直到所有的元素都比较过。
此算法需要两层循环:
1、循环遍历待排序的元素;
2、选择的元素A和 已排序 的所有元素比较。
python实现:
def insertionSort(arr):
for i in range(1, len(arr)):
key = arr[i]
j = i-1
while j >=0 and key < arr[j] :
arr[j+1] = arr[j]
j -= 1
arr[j+1] = key
插入排序的 最坏时间复杂度 O() ,如果 这个数组已经是有序的了,那么内层循环只发生一次比较,不发生交换,也不用循环比。此时最优时间复杂度O(n*1) 即循环 外层的 n * 内层的 1
稳定排序。
希尔排序
希尔排序也称之为递减增量排序,是对插入排序的改进。按前面说,对已经近乎排序好的序列做插入排序,效率很高,可以达到近乎线性。但是插入排序效率也是比较低的,他一次只能将数据向前移一位。比如如果一个长度为N的序列,最小的元素如果恰巧在末尾,那么使用插入排序仍需一步一步的向前移动和比较,要N-1次比较和交换。
希尔排序通过将待比较的元素划分为几个区域来提升插入排序的效率。这样可以让元素可以一次性的朝最终位置迈进一大步,然后算法再取越来越小的步长进行排序,最后一步就是步长为1的普通的插入排序的,但是这个时候,整个序列已经是近似排好序的,所以效率高。
希尔步长的选择:常见的 取 N/2, N/4, ...,1(重复除以2)
python 实现:
def shell_sort(alist):
"""
希尔排序
"""
n = len(alist)
gap = int(n/2)
#控制gap,gap的最终取值是1
while gap >= 1:
for i in (gap,n):
temp = alist[i]
j = i-gap
while j >= 0 and alist[j] > temp:
alist[j+gap] = alist[j]
j -= gap
a[j+gap] = temp
gap = int(gap/2)
希尔排序是不稳定的一种排序算法 。