O(n)查找第k小(大)的数
来源:互联网 发布:stm32f103数据手册pdf 编辑:程序博客网 时间:2024/04/30 11:14
通过快排的思想可以实现在O(n)的时间复杂度下实现:
查找数组第k小的数,在排好序的数组中,就相当于查找第k个数,基于快排的思想,我们只需要判断所找的那个标量是否是第k个数即可。
#include <iostream>int FindIt(int *num,int l,int r,int k){ //核心代码 int index=l; for(int i=l;i<r;++i) //以最后一个元素为标量,比其小的放左边,反之放右边 if(num[i]<num[r]) std::swap(num[i],num[index++]); std::swap(num[index],num[r]); if(index==k) return num[k]; //判断标量是否是第k个 else if(index < k) return FindIt(num,index+1,r,k); else return FindIt(num,l,index-1,k);}int FindKthMax(int *num,int length,int k){ //第k大的数,即第length-k+1小的数 if(!num || length<=0) return 0; return FindIt(num,0,length-1,length-k);}int FindKthMin(int *num,int length,int k){ //第k小的数 if(!num || length<=0) return 0; return FindIt(num,0,length-1,k-1); //数组从0开始}int main(){ int num[]={9,8,7,6,5,4,3,2,1}; std::cout<<FindKthMax(num,sizeof(num)/sizeof(int),3); return 0;}
另外附上快速排序的代码,便于比较:
void QuickSort(int num,int left,int right){ if(left>=right) return; int index=left; for(int i=left;i<right;++i) if(num[i]<num[right]) std::swap(i,num[index++]); std::swap(num[index],num[right]); QuickSort(left,index-1); QuickSort(index+1,right);}
0 0
- O(n)查找第k小(大)的数
- 第K小的数 快速排序 选择前K大O(n)
- 在O(n)时间内查找数组内第k小的数
- o(n)时间寻找第k小的数
- 寻找第K小的数(O(n))
- soj3102 O(n)求第k小的数
- 求第k小的数 O(n)复杂度
- 查找N个数中第K大的数
- 查找N个数中第K大的数
- 查找给定区间内第K大/小的数
- 寻找第k小的元素或者第k大的元素 -- O(n)
- 快排求第K大的数O(n)
- O(n)时间复杂度求最小的k个数和第k小的数
- 数组中查找第k小元素的复杂度为O(n)的算法
- 查找第k大的数
- 在O(n)时间内找到数组中任意第K小的数
- 找第K小的数(O(N))(运用随机思想)
- 查找第N大的数
- 不起眼的 z-index 却能牵扯出这么大的学问
- mobie-web开发6位支付密码验证
- 欢迎使用CSDN-markdown编辑器
- HTML,JS, 笔记
- hdu3863——No Gambling(简单博弈)
- O(n)查找第k小(大)的数
- string,char*,char[]转化
- cc2538 BSL下载固件
- 实用SQL语句大全 from internet
- 通过cookie记住账号的实现方法
- 属性动画
- 网站开通流程
- dtree加载菜单基本使用方法
- 让你的电池多活两年,土豪请自动忽略