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)

    # 这样排序就结束了,下面讲搜索,
  • 相关阅读:
    .net SMTP发送Email 更新(可带附件)
    Ext JS4百强应用: 做可编辑的,可checked的treegrid--第11强
    使你更有思想的20本书
    Sencha Architect 2 的使用
    Test SRM Level One: TemperatureScales
    Test SRM Level Two: CountExpressions, Brute Force
    JPDA 利用Eclipse和Tomcat进行远程调试 --转
    非对称加密算法RSA--转
    java/php/c#版rsa签名以及java验签实现--转
    JAVA/PHP/C#版RSA验签--转
  • 原文地址:https://www.cnblogs.com/andy0816/p/12348382.html
Copyright © 2011-2022 走看看