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