归并、希尔排序

归并排序

假设现在的列表分两段有序,如何将其合成为一个有序列表

归并一次代码实现:

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)
排序小结:

原文地址:https://www.cnblogs.com/dylan123/p/10705031.html