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

    归并排序:参考这个作者的博客,写得非常好
    https://www.cnblogs.com/skywang12345/p/3602369.html
    https://www.cnblogs.com/chengxiao/p/6194356.html
    算法思想:1.递归的对需要排序的列表进行“分”的操作,
    先把列表进行拆分,直到拆分到只剩下最后一个数。
    2.然后开始根据小的在前面,大的在后面做“并”操作。
    使用到递归的思想。
    假设列表为:[5,2,1,4]
    第一次拆分为2半,左边:[5,2],右边[1,4]
    第二次拆分:左边为[5],右边为[2], 左边为[1],右边为[4]
    因为到最小了,因此开始归并。
    左边第一次归并后,比较其大小,左边返回:[2,5]
    右边第一次归并,右边返回[1,4]
    [2,5] [1,4]
    做归并后,[1,2,4,5]
    python算法实现如下:
    import math
    
    """
    #这种方法是直接修改排序原来list列表的值
    def mergeData(outList,start,mid,end):
        tempList = [0]*(end - start)
        i,j,t = start,mid,0
        while (i <mid and j <end):
            if (outList[i]<=outList[j]):
                tempList[t] = outList[i]
                t += 1
                i += 1
            else:
                tempList[t] = outList[j]
                t += 1
                j += 1
        # 将左边剩余元素填充进outList中
        while (i<mid):
            tempList[t] = outList[i]
            t += 1
            i += 1
        # 将右边剩余元素填充进outList中
        while (j<end):
            tempList[t] = outList[j]
            t += 1
            j += 1
       
        #将排序后的元素,全部都整合到数组outList中
        #下面这个代码很重要,要理解透彻,尤其是利用start来加,利用排序好后的数据替换原来的列表
        for k,val in enumerate(tempList) :
            outList[start + k] = val
    """
    
    def mergeData(leftList,rightList):
        tempList = [0] * (len(leftList) + len(rightList))
        i, j, t = 0, 0, 0
        while (i < len(leftList) and j < len(rightList)):
            if (leftList[i] <= rightList[j]):
                tempList[t] = leftList[i]
                t += 1
                i += 1
            else:
                tempList[t] = rightList[j]
                t += 1
                j += 1
        # 将左边剩余元素填充进outList中
        while (i < len(leftList)):
            tempList[t] = leftList[i]
            t += 1
            i += 1
        # 将右边剩余元素填充进outList中
        while (j < len(rightList)):
            tempList[t] = rightList[j]
            t += 1
            j += 1
    
        return tempList
    
    def divideData(oldList,start,end):
        """
        if (end - start <= 1 ):
            return
        """
        #如果区间就1个元素,则返回该值的列表
        if (end-start<=1):
            listOne = []
            listOne.append(oldList[start])
            return listOne
        mid = 0
        mid = math.ceil((start + end) /2)
        #返回左边已排序好的列表,当列表是一个元素时,直接返回该列表元素即可
        leftList =  divideData(oldList,start,mid)
        #返回右边已排序好的列表
        rightList =  divideData(oldList, mid, end)
        rtn =  mergeData(leftList,rightList)
        #mergeData(oldList,start,mid,end)
        return rtn
    
    def mergeSort(data):
        tempList = []
        tempList = divideData(data, 0, len(data))
        return tempList
    
    def main():
        dataList = list(map(int,input("请输入需要排序的列表,逗号间隔:").split(",")))
        sortedList =  mergeSort(dataList)
        print("选择排序结果为:",end="")
        print(sortedList)
    
    if (__name__ == "__main__"):
        main()
    
    
    
     
  • 相关阅读:
    TRECT的使用
    杂记
    Delphi中停靠技术的实现
    高级停靠(Dock)技术的实现
    高级停靠(Dock)技术的实现
    vue组件内的元素转移到指定位置
    mintui loadmore组件使用+代码优化
    vue项目进行nuxt改造
    blob与arraybuffer
    vue项目首屏加载过久处理笔记
  • 原文地址:https://www.cnblogs.com/an-wl/p/12594277.html
Copyright © 2011-2022 走看看