首页 > 编程语言 > 详细

归并、希尔排序

时间:2019-04-14 14:52:18      阅读:109      评论:0      收藏:0      [点我收藏+]

归并排序

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

技术分享图片

 

归并一次代码实现:

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

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!