课时49 归并排序
首先将整个序列进行拆分。
第一次分成两个部分后,再将左边部分拆分成两个部分。
然后就这么拆分到每一个部分只有一个元素。
拆分后,相邻两个元素开始合并。
合并时,小的元素要放在前面。
比如,【54】和【26】合并后,就是【26,54】。
接着,又每两个元素为一组开始合并。
此时需要借助两个游标,一个是右边的,一个是左边的。
左边游标指向的小,先把左边游标的拿出来,然后继续走。
此时移动后,左边游标的比右边游标的大的话,则把右边游标的拿出来。
如此重复。
最后就能得到一个有序序列。
这就是归并序列。
def merge_sort(alist):
"""归并排序"""
n=len(alist)
if n<=1:
return alist
mid=n//2
#left和right为采用归并排序后形成的有序的新的列表
left=merge_sort(alist[:mid])
right=merge_sort(alist[mid:])
#将两个有序的序列left和right合并为一个新的整体
#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__":
li=[54,26,27,88,19,9,89,13]
sorted_li=merge_sort(li) #因为函数是返回一个值,所以需要一个来接收这个值。
print(li)
print(sorted_li)
执行结果:
[54, 26, 27, 88, 19, 9, 89, 13]
[9, 13, 19, 26, 27, 54, 88, 89]
课时50 归并序列_代码执行流程。
以这个列表为例。
首先一进入取了长度,判断其不等于1,则开始取中间值,然后分成两个部分。
等于形成了两个新列表,此时又会对这两个新列表进行拆分。
列用递归不停调用自己,直到长度小于或等于1,此时返回自身。
由于不会再调用,所以left此时保持着上一次递归取得的值。
right也是如此。
此时进入循环。
在循环内,去执行循环语句。也就是合并。
并且一定要返回,返回之后就是上面一个的返回集。
在上面拿到返回值后,才能去执行右边的的函数。
即才能执行上面这个函数。
接着合并。