python排序算法-(5)归并排序
归并排序算法的时间复杂度为O(nlogn),是一种高效的排序算法。 合并排序算法的核心思想是将一个大的数组分成两个较小的数组,递归地对这两个较小的数组进行排序,最后合并回原来的数组。
import random
# 归并函数
def merge(arr, l, m, r):
# 创建两个零数组
n1 = m - l + 1
n2 = r - m
L = [0] * (n1)
R = [0] * (n2)
# 复制数组元素
for i in range(0, n1):
L[i] = arr[l + i]
for j in range(0, n2):
R[j] = arr[m + 1 + j]
# 合并子数组
i = 0 # 第一个子数组的初始索引
j = 0 # 第二个子数组的初始索引
k = l # 合并后的子数组的初始索引
while i < n1 and j < n2:
if L[i] <= R[j]:
arr[k] = L[i]
i += 1
else:
arr[k] = R[j]
j += 1
k += 1
# 复制L剩余的元素(如果有)
while i < n1:
arr[k] = L[i]
i += 1
k += 1
# 复制R剩余的元素(如果有)
while j < n2:
arr[k] = R[j]
j += 1
k += 1
# 归并排序函数
def mergeSort(arr, l, r):
if l < r:
m = (l+r)//2
# 对左右两个子数组进行递归排序
mergeSort(arr, l, m)
mergeSort(arr, m + 1, r)
# 合并左右两个有序子数组
merge(arr, l, m, r)
# 测试
array=random.sample(range(0, 100), 50)
print("原始数组为:")
print(array)
size = len(array)
mergeSort(array,0,size-1)
print('归并排序后的数组为:')
print(array)
运行环境:python3.8
运行结果:
原始数组为:
[97, 11, 56, 36, 31, 48, 98, 34, 1, 55, 91, 58, 63, 46, 26, 68, 96, 10, 65, 72, 77, 6, 86, 92, 99, 51, 89, 64, 67, 87, 23, 21, 9, 70, 57, 2, 61, 75, 37, 74, 30, 20, 8, 41, 94, 15, 53, 33, 12, 44]
归并排序后的数组为:
[1, 2, 6, 8, 9, 10, 11, 12, 15, 20, 21, 23, 26, 30, 31, 33, 34, 36, 37, 41, 44, 46, 48, 51, 53, 55, 56, 57, 58, 61, 63, 64, 65, 67, 68, 70, 72, 74, 75, 77, 86, 87, 89, 91, 92, 94, 96, 97, 98, 99]