返回
带图归纳理解:归并排序的思想、过程与代码实现
见解分享
2024-01-31 22:26:37
归纳理解归并排序
归并排序被广泛认可为一种高效的排序算法,以其时间复杂度为O(nlogn)的稳定表现而被很多程序员熟知。那么,它背后的思想是怎样的呢?如何一步步用代码去实现呢?
归并排序的三步走:
- 归:将一个无序列表分成相等或者近似相等的两部分,对每一部分进行排序,然后将排好序的两个子列表合并为一个列表。
- 并:先将数组分成左右两部分,对这两部分分别进行递归排序,然后将排好序的左右两部分合并成一个整体。
- 排:通过递归,直到各组序列只有0或者1个元素,再分别合并为一个有序序列。
归并排序代码解析:
def merge_sort(array):
# 如果数组长度为1,则数组有序
if len(array) <= 1:
return array
# 将数组分成左右两部分
middle = len(array) // 2
left_array = array[:middle]
right_array = array[middle:]
# 对左右两部分分别进行递归排序
left_array = merge_sort(left_array)
right_array = merge_sort(right_array)
# 合并排好序的左右两部分
return merge(left_array, right_array)
def merge(left_array, right_array):
# 创建一个空列表来保存排好序的数组
merged_array = []
# 创建两个指针,分别指向左右两个数组的开头
left_index = 0
right_index = 0
# 将左右两个数组中的元素逐个比较,并将较小的元素添加到合并后的数组中
while left_index < len(left_array) and right_index < len(right_array):
if left_array[left_index] <= right_array[right_index]:
merged_array.append(left_array[left_index])
left_index += 1
else:
merged_array.append(right_array[right_index])
right_index += 1
# 将左右两个数组中剩余的元素添加到合并后的数组中
merged_array.extend(left_array[left_index:])
merged_array.extend(right_array[right_index:])
# 返回排好序的数组
return merged_array
实战演示:
代码中的关键步骤为:
-
middle = len(array) // 2 left_array = array[:middle] right_array = array[middle:]
将数组分成左右两部分
-
left_array = merge_sort(left_array) right_array = merge_sort(right_array)
对左右两部分分别进行递归排序
-
return merge(left_array, right_array)
合并排好序的左右两部分
例子:
>>> array = [10, 7, 8, 9, 1, 5]
>>> sorted_array = merge_sort(array)
>>> print(sorted_array)
[1, 5, 7, 8, 9, 10]
归并排序是一种思想清晰、运用广泛的算法,学习和掌握它有助于巩固对排序算法的认识,进而对算法和程序设计有更深入的理解。