python十大排序---归并排序

本文深入讲解了归并排序算法的基本思想及其实现过程。通过递归将数组不断切分为更小的子数组,直至每个子数组仅包含一个元素,然后通过比较合并这些子数组,最终得到完全有序的数组。文章提供了详细的代码示例,帮助读者理解和掌握归并排序的精髓。

一、归并排序思想:
(1) 归并排序的思想:
  归并排序的思想就是:首先将原始数组对半切分,然后将所切成的两个子数组再次切分,直到所切分的子数组只有1个元素为止;在此基础上,先创建一个临时数组,再将最后只有1个元素的子数组进行排序,排完序之后将所切成的两个子数组进行合并到临时数组中,,最后将临时数组中的值再重新赋值到原始数组对应的位置中;之后,再返回最终切分操作之前的切分操作,并做相同的操作,对两子数组进行合并;以此类推,直到返回到原始数组所切分成两个子数组为止,并最终合并成有序的数组。所以,该方法采用递归方法比较简单。
为了更好地理解该排序算法,我们来看以下图片:

在这里插入图片描述
二、代码实现:

归并排序:

1.从下往上—分解 将待排序的数列拆分成长度为1 的子数列:递归思想

def merge_sort(arr):
if len(arr)==1:
return arr
num=len(arr)//2
left=merge_sort(arr[:num])
right=merge_sort(arr[num:])
return merge(left,right)

2.从上往上—合并 比较长度为1 的子数列 两两合并----将已排序的两个子区间归并为一个有序的区间:

def merge(left,right):
l,r=0,0
result=[]
while l<len(left) and r<len(right):
if left[l]<right[r]:
result.append(left[l])
l+=1
else:
result.append(right[r])
r+=1
result+=left[l:]
result+=right[r:]
print(result)
return result

调用函数:

if name == ‘main’:
arr=[7,4,3,2,5,1]
merge_sort(arr)

### Python 实现归并排序计算逆序对 在处理数组中的逆序对问题时,使用归并排序是一种高效的解决方案。相较于暴力法的时间复杂度 \(O(n^2)\)[^2],基于归并排序的方法能够将时间复杂度降低到 \(O(n \log n)\)。 #### 归并排序原理简介 归并排序采用的是分治策略,即将待排序序列分为若干子序列分别进行排序后再合并这些有序子序列形成最终的完全有序序列[^3]。此过程不仅实现了排序功能,在分割与合并的过程中还可以统计出原序列中存在的全部逆序对数量。 #### 代码实现 下面是一个完整的Python程序,它展示了如何利用归并排序来计算给定整数列表中的逆序对数目: ```python def merge_and_count_split_inv(B, C): sorted_array = [] inversions = 0 i, j = 0, 0 while i < len(B) and j < len(C): if B[i] <= C[j]: sorted_array.append(B[i]) i += 1 else: sorted_array.append(C[j]) j += 1 inversions += (len(B) - i) # Append any remaining elements of the arrays to 'sorted_array' sorted_array.extend(B[i:]) sorted_array.extend(C[j:]) return sorted_array, inversions def sort_and_count(array): if len(array) <= 1: return array, 0 mid = len(array) // 2 left_half, x = sort_and_count(array[:mid]) right_half, y = sort_and_count(array[mid:]) merged_array, z = merge_and_count_split_inv(left_half, right_half) return merged_array, x + y + z def count_inversions_merge_sort(arr): _, num_of_inversions = sort_and_count(arr) return num_of_inversions # 测试例子 if __name__ == "__main__": test_arr = [1, 3, 5, 2, 4, 6] print(f"Array {test_arr} has {count_inversions_merge_sort(test_arr)} inversions.") ``` 上述代码定义了一个 `merge_and_count_split_inv` 函数用于合并两个已排序的部分,并在此过程中计数跨越这两个部分之间的所有可能存在的逆序对;另一个辅助函数 `sort_and_count` 则负责递归地拆分输入直到单个元素为止,之后再逐步组合起来的同时累计总的逆序对数目。最后,`count_inversions_merge_sort` 提供了一种简便的方式来获取任意数组内的总逆序对数量[^2]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值