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