温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

python排序算法之归并排序怎么实现

发布时间:2023-05-05 16:49:06 来源:亿速云 阅读:80 作者:iii 栏目:开发技术

这篇文章主要介绍“python排序算法之归并排序怎么实现”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“python排序算法之归并排序怎么实现”文章能帮助大家解决问题。

算法描述

本节中的第一种高级排序算法是归并排序。“归并”一词,意为“合并”。顾名思义,归并排序算法就是一个先把数列拆分为子数列,对子数列进行排序后,再把有序的子数列合并为完整的有序数列的算法。它实际上采用了分治的思想。

归并排序的平均时间复杂度是O(nlgn),最好情况下的时间复杂度是O(nlgn),最坏情况下的时间复杂度也是O(nlgn)。它的空间复杂度是O(1)。另外,归并排序还是一个稳定的排序算法。

以升序排序为例,归并算法的流程如图2-21所示。

原始数组是一个有8个数的无序数组。一次操作后,把8个数的数组分成两个4个数组成的无序数组。接下来的每次操作都是把无序数组不停分成两半,直到每个最小的数组里都只有一个元素为止。当数组里只有一个元素时,这个数组必定是有序的。然后,程序开始把小的有序数组每两个合并成为大的有序数组。先是从两个1个数的数组合并成2个数的数组,再到4个数然后8个数。这时,所有的有序数组全部合并完成,最后产生的最长的有序数组就排序完成了。

python排序算法之归并排序怎么实现

代码实现

归并排序代码:

  #归并排序
nums = [5,3,6,4,1,2,8,7]
def MergeSort(num):
  if(len(num)<=1):        #递归边界条件
   return num         #到达边界时返回当前的子数组
  mid = int(len(num)/2)      #求出数组的中位数
  llist,rlist = MergeSort(num[:mid]),MergeSort(num[mid:])#调用函数分别为左右数组排序
  result = []
  i,j = 0,0
  while i < len(llist) and j < len(rlist): #while循环用于合并两个有序数组
   if rlist[j]<llist[i]:
     result.append(rlist[j])
     j += 1
   else:
     result.append(llist[i])
     i += 1
  result += llist[i:]+rlist[j:]  #把数组未添加的部分加到结果数组末尾
  return result         #返回已排序的数组
print(MergeSort(nums))

运行程序,输出结果为:

[1,2,3,4,5,6,7,8]

在MergeSort()函数中,首先进行的是边界条件判断。当传入函数的数组长度只有1时,每一个数独立存在于一个数组中,因此数组已经被分到最小。这时候,递归分解数组的任务已经完成,只需要把分解后的数组返回到上一层递归就可以了。

如果未排序数组的长度仍然大于1,那么使用变量mid来存储数组最中间的下标,把未排序数组分成左右两个子数组。然后,新建两个数组,用于存储排好序的左右子数组。这里使用了递归的思想。我们只把MergeSort()函数视为一个为列表排序的函数,尽管在MergeSort()函数内部,也可以调用函数本身对两个子数组进行排序。

随后,使用while循环合并两个已经有序的数组。由于不能确定两个数组中元素的相对大小,所以我们采用i和j两个变量分别标记在左子数组和右子数组中等待加入的元素的位置。当while循环结束时,可能一个子数组的末尾还剩余一些最大的元素没有被添加到result列表中,所以result+=llist[i:]+rlist[j:]语句是为了防止漏掉这些元素。数组合并完成后,函数输出有序数组。

关于“python排序算法之归并排序怎么实现”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注亿速云行业资讯频道,小编每天都会为大家更新不同的知识点。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI