返回
归并排序,我举个例子你就看懂了
闲谈
2023-10-02 11:24:00
归并排序简介
归并排序(Merge Sort)是一种建立在归并操作上的一种有效、稳定的排序算法。它基于分治法(Divide and Conquer)的思想,将一个无序列表分解成几个有序子列表,然后将这些子列表合并成一个有序列表。
归并排序算法的优点是:
- 稳定排序算法:归并排序保持元素的相对顺序,如果两个元素相等,则它们在排序后的列表中保持相同的相对顺序。
- 时间复杂度为O(n log n):在平均情况下和最坏情况下,归并排序的时间复杂度都为O(n log n)。
- 空间复杂度为O(n):归并排序需要额外的空间来存储临时列表,因此它的空间复杂度为O(n)。
归并排序步骤
归并排序的步骤如下:
- 将列表分解成子列表 :将列表分解成两个或多个较小的子列表,直到每个子列表只有一个元素或没有元素。
- 对子列表进行排序 :使用归并排序或其他排序算法对每个子列表进行排序。
- 合并子列表 :将排好序的子列表合并成一个有序列表。
归并排序示例
为了更清楚地理解归并排序的原理和步骤,我们通过一个简单的例子来演示它。假设我们有一个无序列表:[5, 3, 1, 2, 4],我们使用归并排序对其进行排序。
-
将列表分解成子列表 :
- 将列表[5, 3, 1, 2, 4]分解成两个子列表:[5, 3]和[1, 2, 4]。
- 将子列表[5, 3]分解成两个子列表:[5]和[3]。
- 将子列表[1, 2, 4]分解成两个子列表:[1]、[2]和[4]。
-
对子列表进行排序 :
- 子列表[5]和[3]已经是有序的,因此不需要再进行排序。
- 子列表[1]、[2]和[4]也是有序的,因此不需要再进行排序。
-
合并子列表 :
- 将子列表[5]和[3]合并成有序子列表[3, 5]。
- 将子列表[1]、[2]和[4]合并成有序子列表[1, 2, 4]。
- 将有序子列表[3, 5]和[1, 2, 4]合并成有序列表[1, 2, 3, 4, 5]。
归并排序代码实现
以下是用Python实现的归并排序算法的代码:
def merge_sort(array):
"""
归并排序算法
参数:
array:需要排序的列表
返回:
排序后的列表
"""
if len(array) <= 1:
return array
# 将列表分解成两个子列表
mid = len(array) // 2
left_half = array[:mid]
right_half = array[mid:]
# 对子列表进行排序
left_half = merge_sort(left_half)
right_half = merge_sort(right_half)
# 合并子列表
return merge(left_half, right_half)
def merge(left, right):
"""
合并两个有序列表
参数:
left:第一个有序列表
right:第二个有序列表
返回:
合并后的有序列表
"""
merged = []
left_index = 0
right_index = 0
# 比较两个列表的元素,将较小的元素添加到合并后的列表中
while left_index < len(left) and right_index < len(right):
if left[left_index] <= right[right_index]:
merged.append(left[left_index])
left_index += 1
else:
merged.append(right[right_index])
right_index += 1
# 将剩余元素添加到合并后的列表中
merged.extend(left[left_index:])
merged.extend(right[right_index:])
return merged
归并排序的应用
归并排序是一种广泛使用的排序算法,它在许多领域都有应用,包括:
- 数据分析 :归并排序可用于对大型数据集进行排序,以便进行分析和可视化。
- 数据库管理 :归并排序可用于对数据库中的记录进行排序,以便进行快速查找和检索。
- 图形学 :归并排序可用于对图形中的点或线段进行排序,以便进行渲染和显示。
- 算法 :归并排序可用于对算法中的数据进行排序,以便进行比较和分析。
总结
归并排序是一种高效稳定的排序算法,它基于分治法(Divide and Conquer)的思想,将一个无序列表分解成几个有序子列表,然后将这些子列表合并成一个有序列表。归并排序的时间复杂度为O(n log n),空间复杂度为O(n),并且它是一种稳定排序算法。归并排序在许多领域都有应用,包括数据分析、数据库管理、图形学和算法。