zoukankan      html  css  js  c++  java
  • 数据结构和算法-排序算法-归并排序

     ##################     归并排序        #######################

    """
    归并算法逻辑
    
    拆分
    对整个序列进行拆分,左边一部分,右边一部分
    然后对每一部分再次进行拆分,一直到拆分到只有一个元素,就到头了,
    第1次拆分:54, 26, 93, 17, 77, 31, 44, 55,
    第2次拆分:54, 26, 93, 17,      77, 31, 44, 55,
    第3次拆分:54, 26,        93, 17,       77, 31,      44, 55,
    第4次拆分:54,     26,        93,   17,       77,   31,      44,   55,
    
    合并
    然后把拆分到的再次合并,小的在前,大的在后,
    第1次合并:26,54,     17,93       31,77,      44, 55,
    第2次合并,需要借助两个游标,left,right,
    26,54,     17,93
    左边游标初始指向26,右边游标初始指向17,
    然后左边第一个的和右边的依次比较,如果左边小,数字不动,然后右边的游标往后移动,如果右边小,就把左右的数字交换,
    然后比较完左边的第一个,然后就是第二个,知道把数字都从小到大排序,
    第3次合并的方式都是一样的,直到所有的都排序完毕,
    
    代码实现,
    还是需要使用到递归,
    
    """

    ##################     归并排序        #######################

    def merge_sort(alist):
        n=len(alist)
        if n <=1 :  # 这是如果只有一个元素不往下拆分了,这也是递归结束的条件
            return alist
        mid = n//2
        # 这是左边的部分
        left = merge_sort(alist[:mid])
        # 这是右边的部分,
        right =merge_sort(alist[mid:])
        # 合并:
        # merge(left,right)
    
        # 定义两个游标
        left_pointer ,right_pointer=0,0
        result=[]
    
        while left_pointer<len(left) and  right_pointer < len(right):
            if left[left_pointer]<right[right_pointer]:
                result.append(left[left_pointer])
                left_pointer+=1
            else:
                result.append(right[right_pointer])
                right_pointer+=1
        result +=left[left_pointer:]
        result += right[right_pointer:]
        return result
    
    
    if __name__ == '__main__':
        alist = [54,26,93,17,77,31,44,55,20]
        print(alist)
        sorted_alist = merge_sort(alist)
        print(sorted_alist)

    # 这样排序就结束了,下面讲搜索,
  • 相关阅读:
    【原创】C# 文件操作详解(三)Directory类
    【原创】C# 文件操作详解(一)File类
    【原创】VS使用技巧——工欲善其事必先利其器
    【原创】C# 文件操作详解(四)DirectoryInfo类
    strpos用法
    调试跳转动态打印
    解决DIV超出样式长度自动换行
    PHP时间戳常用转换在(大、小月问题)
    懒人JS
    PHP 快速排序 与二维数组排序
  • 原文地址:https://www.cnblogs.com/andy0816/p/12348382.html
Copyright © 2011-2022 走看看