蓝桥杯Python——day2归并排序
归并排序:分治
待排序数组为nums, 左边界为l,右边界为r
- 确定分界点:mid = (l + r)>> 1
- 递归分隔
- 合并:双指针法
def merge_sort(nums, l, r) :
if l >= r :
return
mid = (l + r) >> 1
merge_sort(nums, l, mid)
merge_sort(nums, mid + 1, r)
tmp = []
i, j = l, mid + 1
while i <= mid and j <= r :
if nums[i] <= nums[j] :
tmp.append(nums[i])
i += 1
else :
tmp.append(nums[j])
j += 1
if i <= mid :
tmp += nums[i: mid + 1]
elif j <= r :
tmp += nums[j : r + 1]
nums[l : r + 1] = tmp
tips : py列表切片赋值一列表,列表元素转换为原列表中元素
字符串的join方法,可以用来用字符串来连接列表中的字符串元素
例题
给定一个长度为 n 的整数数列,请你计算数列中的逆序对的数量。
逆序对的定义如下:对于数列的第 i 个和第 j 个元素,如果满足 i<j 且 a[i]>a[j],则其为一个逆序对;否则不是。
输入格式
第一行包含整数 n,表示数列的长度。
第二行包含 n 个整数,表示整个数列。
输出格式
输出一个整数,表示逆序对的个数。
数据范围
1≤n≤100000,
数列中的元素的取值范围 [1,109]。
输入样例:
6
2 3 4 5 6 1
输出样例:
5
n = int(input())
nums = list(map(int, input().strip().split()))
res = 0
def merge_sort(nums, l, r) :
global res
if l >= r :
return
mid = (l + r) >> 1
i, j = l, mid + 1
tmp = []
merge_sort(nums, l, mid)
merge_sort(nums, mid + 1, r)
while i <= mid and j <= r :
if nums[i] <= nums[j] :
tmp.append(nums[i])
i += 1
else:
tmp.append(nums[j])
j += 1
res += mid - i + 1
if i <= mid :
tmp += nums[i : mid + 1]
elif j <= r :
tmp += nums[j : r + 1]
nums[l : r + 1] = tmp
merge_sort(nums, 0, n - 1)
print(res)
tips : python函数中要引用外部的全局变量,需要在函数中使用global关键字声明
总结:快排属于尾递归,对应于树的遍历属于前序遍历,归并排序是首递归,对应于后序遍历
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· NetPad:一个.NET开源、跨平台的C#编辑器
· PowerShell开发游戏 · 打蜜蜂
· 凌晨三点救火实录:Java内存泄漏的七个神坑,你至少踩过三个!