归并排序
假设现在的列表分两段有序,如何将其合成为一个有序列表
归并一次代码实现:
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)
排序小结: