zoukankan      html  css  js  c++  java
  • 用python实现归并排序

    def merge(lfrom, lto, low, mid, high):
        i, j, k = low, mid, low
        while i < mid and j < high:
            if lfrom[i] < lfrom[j]:
                lto[k] = lfrom[i]
                i += 1
            else:
                lto[k] = lfrom[j]
                j += 1
            k += 1
        while i < mid:
            lto[k] = lfrom[i]
            i += 1
            k += 1
        while j < high:
            lto[k] = lfrom[j]
            j += 1
            k += 1
    
    
    def merge_pass(lfrom, lto, llen, slen):
        i = 0
        while i+2*slen < llen:
            merge(lfrom, lto, i, i+slen, i+2*slen)
            i += 2*slen
        if i + slen < llen:
            merge(lfrom, lto, i, i+slen, llen)
        else:
            for j in range(i, llen):
                lto[j] = lfrom[j]
    
    
    def merge_sort(lst):
        slen, llen = 1, len(lst)
        templist = [None]*llen
        while slen < llen:
            merge_pass(lst, templist, llen, slen)
            slen *= 2
            merge_pass(templist, lst, llen, slen)
            slen *= 2
    

    归并排序的思想是:

    1. 跟快速排序从长序列排到短序列相反,归并排序是先排短的,再排长的。
    2. 对于一个序列,一开始视每一个元素为一个序列,两两合并。对于每一个“两两合并”,就是将两个排好序的序列合并的过程。
    3. 归并排序需要开辟和原序列一样大的空间。归并一遍的结果放到开辟的空间中。第二次的归并是从新空间归并到旧空间,如此反复就把序列排序了。
    4. 实现一共分为三个层级:
    • 最低层级: 将两个已排序序列合并
    • 中间层级:将整个序列,根据子序列长度,分别归并
    • 最高层级:将子序列长度从1开始翻倍增加,直到子序列长度和序列长度一样,归并完成。
  • 相关阅读:
    利用WebClient实现自动添写、提交表单
    动态.net代码生成器遇到的问题
    unicode
    使用using清理非托管资源
    C#中解决插入数据库的某个字段类型为datetime 为空
    JQuery中根据属性或属性值获得元素
    Access 的top和order by 的问题
    JavaScript escape() 函数
    Asp.net嵌套
    合并程序集时出错的问题ILMerge.Merge.ERROR...
  • 原文地址:https://www.cnblogs.com/theodoric008/p/8033095.html
Copyright © 2011-2022 走看看