归并排序——python实现

归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。归并排序适用于子序列有序的数据排序。

1、原理
  归并排序是分治法的典型应用。分治法(Divide-and-Conquer):将原问题划分成 n 个规模较小而结构与原问题相似的子问题;递归地解决这些问题,然后再合并其结果,就得到原问题的解。从上图看分解后的数列很像一个二叉树。

归并排序采用分而治之的原理:

将一个序列从中间位置分成两个序列;
在将这两个子序列按照第一步继续二分下去;
直到所有子序列的长度都为1,也就是不可以再二分截止。这时候再两两合并成一个有序序列即可。在这里插入图片描述

 def merge_sort(arr):
 2     """归并排序"""
 3     if len(arr) == 1:
 4         return arr
 5     # 使用二分法将数列分两个
 6     mid = len(arr) // 2
 7     left = arr[:mid]
 8     right = arr[mid:]
 9     # 使用递归运算
10     return marge(merge_sort(left), merge_sort(right))
11 
12 
13 def marge(left, right):
14     """排序合并两个数列"""
15     result = []
16     # 两个数列都有值
17     while left and right:
18         # 左右两个数列第一个最小放前面
19         if left[0] <= right[0]:
20             result.append(left.pop(0))
21         else:
22             result.append(right.pop(0))
23     # 只有一个数列中还有值,直接添加
24     result += left
25     result += right
26     return result
27 
28 merge_sort([11, 99, 33 , 69, 77, 88, 55, 11, 33, 36,39, 66, 44, 22])
29 
30 # 返回结果[11, 11, 22, 33, 33, 36, 39, 44, 55, 66, 69, 77, 88, 99]
归并排序是一种常见的排序算法,可以通过将待排序的数组不断地分割成更小的子数组,直到每个子数组只包含一个元素,然后将这些子数组逐步合并以得到最终的排序数组。在Python中,可以使用递归的方式实现归并排序。 以下是一个用Python实现归并排序的代码示例: ```python # 归并排序 def MergeSort(nums): if len(nums) <= 1: return nums mid = len(nums) // 2 left = MergeSort(nums[:mid]) right = MergeSort(nums[mid:]) return merge(left, right) def merge(left, right): merged = [] i, j = 0, 0 while i < len(left) and j < len(right): if left[i < right[j]: merged.append(left[i]) i += 1 else: merged.append(right[j]) j += 1 merged += left[i:] merged += right[j:] return merged # 测试 nums = [5, 3, 6, 4, 1, 2, 8, 7] print(MergeSort(nums)) ``` 这段代码实现归并排序算法,首先将待排序的数组不断地分割成更小的子数组,然后通过合并两个有序的子数组来得到最终的排序数组。在递归的过程中,每个子数组都会被排序并返回,然后再进行合并操作。最后,输出排序后的结果。 归并排序是一种稳定的排序算法,它的时间复杂度为O(nlogn),其中n是待排序数组的长度。相比于初级排序算法归并排序具有更高的时间效率。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Python排序算法(六)——归并排序(MERGE-SORT)](https://blog.csdn.net/u010986753/article/details/96532989)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [python排序算法——归并排序(附代码)](https://blog.csdn.net/AOAIYI/article/details/128657679)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值