zoukankan      html  css  js  c++  java
  • 归并、希尔排序

    归并排序

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

    归并一次代码实现:

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

  • 相关阅读:
    LinQ&EF任我行(一)LinQ to SQL (转)
    WPF数据模板和控件模板
    Sql优化
    SQL锁表语句
    js动态创建dom
    js实现等待n秒后按钮可用
    js关于事件冒泡
    工作流学习(个人总结)
    sql常用函数
    将Datatable序列化为Json对象返回到客户端
  • 原文地址:https://www.cnblogs.com/dylan123/p/10705031.html
Copyright © 2011-2022 走看看