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


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

     这种操作称为一次归并。

    一次归并代码:

    def merge(li, low, mid, high):
        """
        一次归并(把列表的两段有序列表,归并成一个有序列表)
        :param li:
        :param low: 第一个元素位置
        :param mid: 中间元素位置
        :param high: 边界元素位置
        :return:
        """
        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
    
    li = [2,4,5,7,1,3,6,8]
    merge(li, 0, 3, 7)
    print(li)

    归并排序----使用归并

    • 分解:将列表越分越小,直至分成一个元素
    • 终止条件:一个元素是有序的
    • 合并:将两个有序列表合并,列表越来越大。

    归并排序代码实现

    def merge_sort(li, low, high):
        if low < high:
            mid = (low+high) // 2
            merge_sort(li, low, mid)
            merge_sort(li, mid+1, high)
            merge(li, low, mid, high)
    
    import random
    li = list(range(1000))
    random.shuffle(li)
    print(li)
    merge_sort(li, 0, len(li)-1)
    print(li)

    NB三人组(快速排序,堆排序,归并排序)小结:

    • 三种排序算法的时间复杂度都是O(nlogn)
    • 一般情况下,就运行时间而言:
      • 快速排序>归并排序>堆排序
    • 三种排序算法的缺点:
      • 快速排序:极端的情况下排序效率低
      • 归并排序:需要额外的内存开销
      • 堆排序:在快的排序算法中相对较慢

    6种常见排序算法小结:(冒泡排序,选择排序,插入排序,快速排序,堆排序,归并排序)

  • 相关阅读:
    Java常用的7大排序算法汇总
    swift 内存管理,WEAK 和 UNOWNED
    Java关键字final、static使用总结
    Swift对面向对象提供了良好的支持,下面介绍几个其独有的特性。
    如何自己动手实现 KVO(转)
    Method Swizzling 和 AOP 实践(转)
    Objective-C Runtime(转)
    在多线程中进行UI操作
    iOS 详解NSXMLParser方法解析XML数据方法
    用一张日落照片估算出地球的半径
  • 原文地址:https://www.cnblogs.com/Xuuuuuu/p/10819193.html
Copyright © 2011-2022 走看看