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

  • 相关阅读:
    VS 2010下一次性配置opencv(32位和64位相同)
    模拟鼠标事件
    Main函数参数argc,argv说明
    Visual Studio 2010 LINK : fatal error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏解决方案
    常量指针和指针常量
    strlen函数实现的几种方法
    杀死指定的进程名
    typedef和typename关键字
    如何理解dart的mixin
    c# 通过dllimport 调用c 动态链接库
  • 原文地址:https://www.cnblogs.com/dylan123/p/10705031.html
Copyright © 2011-2022 走看看