分治法——线性时间选择

 线性时间排序算法的目的是为了从一堆乱序数组中找到第k小的元素,最开始给出的代码是先将乱序数组按照线性顺序排序,然后从中找出第k小的元素。

上图代码使用上节内容学过的快速排序,用RandomizedPartition将a划分为[p,i]  [i+1,r]

j=i-p+1即为[p,i]中包含的元素,虽然还未对这两段进行过排序,但我们知道左端是小于a[j]的,而右端是大于a[j]的,因此a[j]的排序顺序是正确的,我们比较k与j的大小,如果发现k<=j,那么k的位置一定是在左端[p,j](因为题目中的k是从1开始的,而数组却是从0开始的,也就是说k=2,数组元素对应a[1],k如果正好为我们划分的基准元素,k=j+1),而k>j时,则对右端进行随机选取。(其实这里有个问题,k=j+1时就应该找到k直接输出)。直到分无可分则输出最后的结果k。

简单描述一下优化后的选择划分基准,仔细对比图2-7,

首先它将所有元素分为5个一组,那么分成的结果最多只有一组不满5个,假设n/5正好是整数,如图所示分成了7组。首先要明白为什么55分组,因为考虑到查找的最快情况,如果我们找到了需要寻找的k在那一组,以中位数为基准,每一段仅仅需要查找两个数,这样就能快速找到k在那组的什么位置。

如果我们对所有元素进行排序,那么情况肯定是很复杂的,并且如果从一个很大的数组也不方便寻找中位数。而55分组是很方便寻找中位数的,因此我们选出每组的中位数(因为只有五个数字,因此使用任意排序算法皆可),即为图中的白点。7组找到了7个白点,然后将所有中位数看作一组,再次使用快速排序的思想,寻找到所有基准数中的中位数,将这个中位数作为划分基准。从中位数组的中位数划分出k的位置,然后寻找到k应当属于那一个中位数组,最后在这个中位数组中寻找k的位置。

算法中认为分成3(n-5)/10>=n/4,因此n=75,当数组长度<75时需要对数组进行简单排序

最接近点对问题好像有点复杂了,因此先不讲了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值