排序-归并

归并排序:参考这个作者的博客,写得非常好
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()

 

 
posted @ 2020-03-29 19:39  StudyNLP  阅读(153)  评论(0编辑  收藏  举报