"""
归并排序:
归并:将两个或者两个以上的有序表组成一个新的有序表。
2-路归并排序:假定待排序表含有n个记录,则可以看成是n个有序的子表,每个子表的长度为1,然后两辆归并,得到[n/2]个长度为2或者1的有序表。
再两两归并,.....如此重复,知道合成一个长度为n的有序表为止。
二路归并排序(稳定排序),结果升序 算法思想:
2-路归并排序主旨是“分解”与“归并”
分解:
1.将一个数组分成两个数组,分别对两个数组进行排序。
2.循环第一步,直到划分出来的“小数组”只包含一个元素, 只有一个元素的数组默认为已经排好序。
归并:
1.将两个有序的数组合并到一个大的数组中。
2.从最小的只包含一个元素的数组开始两两合并。此时,合并好的数组也是有序的。
"""
def merge_sort(nums):
size = len(nums)
if size <= 1:
return nums
middle = size // 2
left = merge_sort(nums[:middle])
right = merge_sort(nums[middle:])
return merge(left, right)
def merge(nums_a, nums_b):
merge_nums = []
start_a = start_b = 0
size_a = len(nums_a)
size_b = len(nums_b)
while start_a < size_a and start_b < size_b:
if nums_a[start_a] < nums_b[start_b]:
merge_nums.append(nums_a[start_a])
start_a += 1
else:
merge_nums.append(nums_b[start_b])
start_b += 1
if start_a == size_a:
for i in nums_b[start_b:]:
merge_nums.append(i)
else:
for i in nums_a[start_a:]:
merge_nums.append(i)
return merge_nums
if __name__ == '__main__':
nums = [49, 38, 65, 97, 76, 13, 27]
print(merge_sort(nums))
Fighting-算法-归并排序
最新推荐文章于 2025-04-30 16:36:16 发布