查找第k小(中位数)

中位数就是一列数按从小到大排序后中间的那个数,如有n个数,如果n是奇数那么中位数就是n div 2+1的那个数,偶数的话有下中位数和上中位数分别为第n div 2和n div 2+1。查找中位数就是查找一列数中第n div 2或n div 2+1小的数。

    查找第k小的数最直观的方法就是先排序再输出数组中对应下标的值,这样做的时间复杂度取决于排序的时间复杂度,如果是快速排序的话是O(nlogn),其 实有更快捷的算法,形式上像是快速排序,实质上是把快速排序的过程简化了一下,去掉与此无关的操作就得到了该算法,因此,该算法时间复杂度同为 O(nlogn)但省去不少步骤,因而比快速排序的算法要快。为方便介绍先简单复习一下快速排序,快速排序是一种二分的算法首先选定一个数作为基准,再把 数组按该基准分成左右两块,分别是小于和大于该基准的所有数,再递归对这两块分别进行上述划分过程直到区间被分成单个的数。在这里不是每次都要递归划分, 如果小于基准的那块包含g-1个数那么该基准就是第g小,个数可以由前后座标的差加上1得到,如果g=k这时已经找到答案可以退出程序了。如果g> k,那么在小于基准那一块中的第k小的数就是全部的第k小,如果g<k,那么就在大于基准的那块中查找第k-g小,这样的查找已经缩小了数据规模, 也就快捷的多了。基准的选取可以有很多方式,一般选取最后一个或第一个,我的程序中选最后一个。但如果是已经有序的数列,那么这种基准的划分结果就很不平 衡,因此采用随机挑选基准的方法就会好很多。下面程序中rs函数就是随机选定基准进行划分。divided就是划分的过程。

   在divided中有两个指针i和j,所有下标小于i的数组元素均小于基准,在i与j之间的元素均大于基准,在程序结束时i的位置就是基准在排序后所在的位置。

下面是pascal的程序,是我从c语言翻译过来的,偶然发现在lazarus中使用c语言的行注释方法并没有报错,于是没有改过来

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值