归并排序
假设现在的列表分两段有序,如何将其合成为一个有序列表
归并一次代码实现:
def merge(li, low, mid, high):
i = low
j = mid + 1
ltmp = []
while i <= mid and j <= high:
if li[i] < li[j]:
ltmp.append(li[i])
i += 1
else:
ltmp.append(li[j])
j += 1
while i <= mid:
ltmp.append(li[i])
i += 1
while j <= high:
ltmp.append(li[j])
j += 1
li[low:high+1] = ltmp
归并用法示意图:
a.分解:将列表越分越小,直至分成一个元素。
b.一个元素是有序的。
c.合并:将两个有序列表归并,列表越来越大。
归并排序代码实现:
def _mergesort(li, low, high):
if low < high:
mid = (low + high) // 2
_mergesort(li,low, mid)
_mergesort(li, mid+1, high)
merge(li, low, mid, high)
时间复杂度:O(nlogn)
空间复杂度:O(n)
快速排序、堆排序、归并排序-小结
1、一般情况下,就运行时间而言:
快速排序 < 归并排序 < 堆排序
2、三种排序算法的缺点:
快速排序:极端情况下排序效率低
归并排序:需要额外的内存开销
堆排序:在快的排序算法中相对较慢
希尔排序
希尔排序是一种分组插入排序算法。
1、首先取一个整数d1=n/2,将元素分为d1个组,每组相邻量元素之间距离为d1,在各组内进行直接插入排序;
2、取第二个整数d2=d1/2,重复上述分组排序过程,直到di=1,即所有元素在同一组内进行直接插入排序。
3、希尔排序每趟并不使某些元素有序,而是使整体数据越来越接近有序;最后一趟排序使得所有数据有序。
py代码实现
def shell_sort(li):
gap = int(len(li) // 2)
while gap >= 1:
for i in range(gap, len(li)):
tmp = li[i]
j = i - gap
while j >= 0 and tmp < li[j]:
li[j + gap] = li[j]
j -= gap
li[i - gap] = tmp
gap = gap // 2
时间复杂度: O((1+τ)n)
O(1.3n)
排序小结: