找出输入数字中第k个元素,从小到大

一:问题
用分治法找出数组中第K个元素,从小到大。
二;解析
使用快速排序,来把一个串(list)分为两个子串(sub-lists)。具体算法描述如下:
1.从数列中挑出一个元素,称为 “基准”(pivot),这里我们通常都会选择第一个元素作为prvot;
2.重新排序数列,将比基准值小的所有元素放在基准前面,比基准值大的所有元素放在基准的后面(相同的数可以到任一边)。这样操作完成后,该基准就处于新数列的中间位置,即将数列分成了两部分。这个操作称为分区(partition)操作;
3.递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数按上述操作进行排序。这里的递归结束的条件是序列的大小为0或1。此时递归结束,排序就完成了。
三:设计
def QuickSort(array, start, end):
lengths = len(array)
i = start
j = end
# 结束排序(左右两索引值见面,即相等,或者左索引>右索引)
if i >= j:
return # 返回空即可
# 保存首个数值(以首个数值作为基准)
# 这个位置很重要,一定要在if i>=j判断语句之后,否则就索引溢出了
pivot = array[i]
# 一次排序,i和j的值不断的靠拢,然后最终停止,结束一次排序
while i < j:
# (从右往左)和最右边的比较,如果>=pivot,即满足要求,不需要交换,然后j-1,慢慢左移,即拿基准值与前一个值比较; 如果值<pivot,那么就交换位置
while i < j and pivot <= array[j]:
# print(pivot, array[j], ‘’ * 30)
j -= 1
array[i] = array[j]
# 交换位置后,然后在和最左边的值开始比较,如果<=pivot,然后i+1,慢慢的和后一个值比较;如果值>pivot,那么就交换位置
while i < j and pivot >= array[i]:
# print(pivot, array[i], '
’ * 30)
i += 1
array[j] = array[i]
# 列表中索引i的位置为基准值,i左边序列都是小于基准值的,i右边序列都是大于基准值的,当前基准值的索引为i,之后不变
array[i] = pivot
# 左边排序
QuickSort(array, start, i-1)
# 右边排序
QuickSort(array, i+1, end)

四:分析
时间复杂度:O(nlogn)
空间复杂度:O(logn)
五:源码
地址

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值