quickselect算法

快速选择算法是从快速排序中衍生出来的一种选择算法,它用于在未排序的数据中找到第k小(或大)的元素。算法主要利用了分治的思想,通过一次划分操作将问题规模缩小,平均时间复杂度为O(n)。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

quickselect算法是从一个无序数组里选择出第k小的元素,它和快速排序算法很像,因为作者都是同一个人==。该算法的时间复杂度为O(n)情况最差的时候时间复杂度为O(n2)

快速选择算法借鉴快速排序算法,快速排序的算法如下:

function partition(list,left,right,pivotIndex):
     pivotValue := list[pivotIndex]
     swap list[pivotIndex] and list[right]  // Move pivot to end
     storeIndex := left
     for i from left to right-1
         if list[i] < pivotValue
             swap list[storeIndex] and list[i]
             increment storeIndex
     swap list[right] and list[storeIndex]  // Move pivot to its final place
     return storeIndex
上述算法是在数组中将pivotIndex位置处的值插入到left到right之间的适当位置,使storeIndex之前的值都比他小,之后的值都比他大。
快速选择的算法使用上述算法,寻找k次就可以了

 function select(list, left, right, k)
     if left = right     
         return list[left]  
     pivotIndex  := ...    //随机一个数                           
     pivotIndex  := partition(list, left, right, pivotIndex
     if k = pivotIndex
         return list[k]
     else if k < pivotIndex
         return select(list, left, pivotIndex - 1, k)
     else
         return select(list, pivotIndex + 1, right, k)


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值