蓝桥杯Python——day2快速排序
快速排序基本思想:分治
下面假设对nums数组排序, l为左边界, r为右边界
- 确定分界点:可以是nums[l]、nums[r]、nums[(l + r) >> 2],设为d
- 调整区间:将小于d的元素放到相对于大于d元素的左边,大于d的放在右边
- 递归处理左右两端
调整区间的两种方法
- 每次调整区间用三个列表存,left、mid、right,left存小于d的元素,mid存等于d的元素,right存大于d的元素,最后将这三个列表连接即可
上代码:
def quick_sort1(nums) :
if len(nums) <= 1 : return nums
left = []
mid = []
right = []
d = nums[len(nums) // 2]
for i in nums :
if i < d :
left.append(i)
elif i > d :
right.append(i)
else :
mid.append(i)
return quick_sort1(left) + mid + quick_sort1(right)
- 双指针法: 没啥好讲的,碰到左右两边都需要交换的话,换一下。
def quick_sort2(nums, l, r) :
if l >= r :
return
i = l - 1###配合下面do while中先移位后运算的方法
j = r + 1
d = nums[l]
while i < j :
while True :###因为每次交换完后都要跳到上次交换后的下一位,所以要用do...while..
i += 1
if nums[i] >= d :
break
while True :
j -= 1
if nums[j] <= d :
break
if i < j :
nums[i], nums[j] = nums[j], nums[i]
quick_sort2(nums, l, j)
quick_sort2(nums, j + 1, r)
例题:
给定一个长度为 n 的整数数列,以及一个整数 k,请用快速选择算法求出数列从小到大排序后的第 k 个数。
输入格式
第一行包含两个整数 n 和 k。
第二行包含 n 个整数(所有整数均在 1∼109 范围内),表示整数数列。
输出格式
输出一个整数,表示数列的第 k 小数。
数据范围
1≤n≤100000,
1≤k≤n
输入样例:
5 3
2 4 1 5 3
输出样例:
3
n, k = map(int, input().split())
nums = list(map(int, input().split()))
def quick_sort(nums, k) :
d = nums[0]
left = []
mid = []
right = []
for i in nums :
if i < d :
left.append(i)
elif i == d :
mid.append(i)
else :
right.append(i)
if len(left) >= k :
return quick_sort(left, k)
elif len(left) + len(mid) >= k :
return d
else :
return quick_sort(right, k - len(left) - len(mid))
print(quick_sort(nums, k))
总结
记得大二上学期学数据结构就学过快排,到今天大三才弄得,真的觉得自己太不扎实了emo,说实话Python写代码真不习惯。循序渐进吧,一定要有自己思考和感悟,遇到问题一定要解决,不要好高骛远,不着边际。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· NetPad:一个.NET开源、跨平台的C#编辑器
· PowerShell开发游戏 · 打蜜蜂
· 凌晨三点救火实录:Java内存泄漏的七个神坑,你至少踩过三个!