查找第K小元素(C语言版)

       今天在看《算法:C语言实现》时,在高速排序那一章最后一节讲述了利用高速排序的思想。高速排序每次划分后在枢轴的左边的元素都比枢轴小(或相等),在枢轴右边的数都比枢轴大(或相等)。而划分后枢轴本身就放在了(有序时)它自身应该在的位置,在每次划分后推断枢轴下标和k的大小就能够高速找出数列中第k小的数了。

       看完之后。我想既然利用高速排序的思想能够非常快的找到第k小的数,那么能不能利用计数排序的思想来查找第k小的数呢。细致一想,全然能够!计数排序是利用一个计数数组C来记录待排序数组中各个不同数值出现的次数,然后通过一次遍历计数数组C,利用C[i] += C[i-1]就能够得到小于等于数值i的元素的个数,然后依照C[i]就能够把待排序数组中值为i的数放到它应该在的位置上。那怎么利用这个计数数组C呢?在对计数数组进行遍历后(运行C[i] += C[i-1]),C[i]代表待排序数组中值小于等于i的元素个数,而C[i-1]代表值小于等于i-1的元素个数,假设 C[i-1] < k而且k <= C[i],那么待排序数组中第k小的数必然就是值为i的数!查找就能够结束了。所以仅仅须要找到第一个满足条件k <= C[i]的i就可以。

       在说详细的算法之前先约定第k小的数为在数列有序时从0開始的第k-1个数。也就是k>

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值