首页 > 编程语言 >归并排序 返回逆序数 python

归并排序 返回逆序数 python

时间:2024-04-05 12:59:30浏览次数:20  
标签:sort 归并 python arr print inversions 序数

def merge_sort_and_count_inversions(arr):
   n = len(arr)
   if n <= 1:
      return arr, 0  # 如果n小于等于1,数组已经有序,直接返回数组本身和逆序数0
   
   mid = n // 2
   left_lst, inv_left = merge_sort_and_count_inversions(arr[:mid])  # 对左半部分进行递归,并获取结果和逆序数
   right_lst, inv_right = merge_sort_and_count_inversions(arr[mid:])  # 对右半部分进行递归,并获取结果和逆序数
   
   # 分解完,该合并了
   left_pointer, right_pointer = 0, 0  # 两个指针
   result = []  # 定义一个空列表进行存储数据
   inv_merge = 0  # 用于记录合并时产生的逆序数
   
   while left_pointer < len(left_lst) and right_pointer < len(right_lst):  # 当两个指针没有超出各自的范围时
      if left_lst[left_pointer] <= right_lst[right_pointer]:
         result.append(left_lst[left_pointer])
         left_pointer += 1
      else:
         result.append(right_lst[right_pointer])
         right_pointer += 1
         # 每当一个右半部分的元素被加入结果列表时,说明它和左半部分剩下的所有元素都构成了逆序对
         inv_merge += len(left_lst) - left_pointer
      
      # 当退出循环后,将剩余的部分添加到result中
   result += left_lst[left_pointer:]
   result += right_lst[right_pointer:]
   
   # 返回合并后的结果和总的逆序数
   return result, inv_left + inv_right + inv_merge


# 示例数组
arr = [1, 5, 3, 4, 2, 6]
# 计算排序后的数组和逆序数
sorted_arr, inversions = merge_sort_and_count_inversions(arr)
print(f"原数组是: {sorted_arr}")
print(f"逆序数个数是: {inversions}")

标签:sort,归并,python,arr,print,inversions,序数
From: https://blog.csdn.net/qingcheng_123456/article/details/137357006

相关文章

  • 代码随想录算法训练营第二天 | 数组 977.有序数组的平方
    leetcode977.有序数组的平方题目977.有序数组的平方给你一个按非递减顺序排序的整数数组nums,返回每个数字的平方组成的新数组,要求也按非递减顺序排序。示例1:输入:nums=[-4,-1,0,3,10]输出:[0,1,9,16,100]解释:平方后,数组变为[16,1,0,9,100]排序后,数组变为[0,1,9......
  • python 插值搜索-迭代与递归(Interpolation Search)
             给定一个由n个均匀分布值arr[]组成的排序数组,编写一个函数来搜索数组中的特定元素x。         线性搜索需要O(n)时间找到元素,跳转搜索需要O(?n)时间,二分搜索需要O(logn)时间。插值搜索是对实例二分搜索的改进,其中排序数组中的值是......
  • Python自学:类 构造方法练习(思路打不通,还遇到赋值错乱!)
    开始学习类一个练习,就是输入学生信息,并且要用到forinput结合,构造方法等。自己思考时,这个应该先设计一个类,然后用input输入,之前练习过main架构 tools调用两个py文件相互辅助,这个是不是也是,还有全局变量,想了很多结果不是,乱的。看了课件,用到forxinrange(1,11):开......
  • Python基础
    本人以前学习python基础时的两个简单实战1.模拟网上购物流程#创建空的购物车list=[]foriinrange(5):goods=input("请输入对应的商品编号和商品名称入库,每次只能输入一个产品:")list.append(goods)foriteminlist:print(item)#创建一个空列表,购物车......
  • Python线程池的概念涉及创建一个线程集合(即线程池)
    Python线程池的概念涉及创建一个线程集合(即线程池),这些线程预先被初始化并保存在内存中,等待任务的分配和执行。使用线程池可以有效地管理和复用线程资源,提高程序的执行效率。以下是Python线程池相关的概念及其示例程序:1.线程池(ThreadPool)线程池是一个管理线程的集合,它负责线......
  • LeetCode in Python 88. Merge Sorted Array (合并两个有序数组)
    合并有序数组也有两种方法,区别是空间复杂度不同。第一种,重新开辟一个数组空间,大小为O(m+n),另外需要三个指针分别指向两个有序数组和新开辟的数组,依次判断两个数组内元素大小,不断更新指针即可。第二种,无需单独开辟空间,在第一个数组(该数组空间足够存放两个数组总长的数据)内进行......
  • nodejs+python开发基于uniapp的校园跑腿系统 微信小程序
    本文先提出了开发基于uniapp的高校校园跑腿系统的背景意义,然后通过功能性和非功能性分析阐述本系统的需求,然后从功能设计和数据库设计两方面进行系统的设计建模。在技术实现部分采用了nodejs作为开发后台的编程语言,客户端使用uniapp,数据库选择MySQL。最后进行了代码的编写,并说......
  • 【python毕业设计】社区居民健康档案管理系统8cgo7
    典型的应用系统中还需要系统维护这一功能,其主要包括:(1)可以完成社区居民家庭和个人基本信息的维护和查询功能。(2)可以完成社区居民健康档案管理系统用户的添加、删除、修改等功能。(3)可以完成用户组的维护和用户组的查询功能。(4)可以完成数据备份和恢复的功能。(5)可以完成......
  • python3.12.2银河麒麟v10鲲鹏离线快速部署
    python3.12.2银河麒麟v10鲲鹏离线快速部署背景清明假期忙活了一整天发现自己方向走错了.部署效率巨慢无比.其实简单情况下很快就可以弄好.自己最开始使用python3.9使用的是libressl发现最新版已经不需要了.并且使用仓库中的就可以.系统版本说明公司的银河麒麟v10......
  • Python进阶:使用requests库轻松发送HTTP请求并获取响应
    Python进阶:使用requests库轻松发送HTTP请求并获取响应简介:本文将带您深入了解Python中强大的requests库,学会如何使用它发送各种HTTP请求,并轻松获取响应内容。无论您是初学者还是有一定经验的Python开发者,本文都将为您提供实用、详细的指导,助您在网络请求与响应的处理上更上......