BFPTR算法(中位数的中位数算法)求n个数中第k大的数
来源:互联网 发布:淘宝店最高收入多少 编辑:程序博客网 时间:2024/04/30 10:52
BFPTR算法求n个数中第k大(即第n-1-k小)的数,其思想是基于快速排序中对Partion的pivot值进行优化,快速排序中每一趟快排的pivot的选取一般是数组的首项或者尾项(数值比较随机),而BFPTR是每次选择5分中位数的中位数作为pivot进行下一趟快速排序的,这样做可以使算法的时间复杂度由最坏的O(n^2)变为O(n).
实现代码如下:
#include <iostream>using namespace std;const int maxn=1000;int a[maxn],n,k; //求有n个元素的数组a中第k大(第n-1-k小)的数void Insert_Sort(int a[],int l,int r){//由于只有5个数,插入排序即可 for(int i=l;i<=r;i++) { int tmp=a[i],j=i-1; for(;j>=l&&tmp<a[j];j--) a[j+1]=a[j]; a[j+1]=tmp; }}int Find_mid(int a[],int l,int r){//寻找中位数的中位数 if(l==r) return a[l]; int i=0,n=0; for(int i=l;i<r-5;i+=5) { Insert_Sort(a,i,i+4); //每5个数按升序排列 n=i-l; swap(a[l+n/5],a[i+2]); //将找到的中位数放在数组a的前面 } //处理剩余元素 int res=r-i+1; if(res>0) { Insert_Sort(a,i,i+res-1); n=i-l; swap(a[l+n/5],a[i+res/2]); } n/=5; //a[0..n]存放本趟分组的中位数 if(n<=1) return a[l]; //当中位数小于2个(下标n<=1)时直接返回较小的 return Find_mid(a,l,l+n); //大于2个时递归继续寻找中位数}int Find_pos(int a[],int l,int r,int mid){//找到中位数的中位数在a中的下标 for(int i=l;i<=r;i++) if(a[i]==mid) return i; return -1;}int Partion(int a[],int l,int r,int pos){//进行划分过程 swap(a[pos],a[l]); //将找到的中位数的中位数(即mid)换到数组a的最前面 int i=l,j=r; int pivot=a[l]; while(i<j) { while(i<j&&a[j]>=pivot) j--; a[i]=a[j]; while(i<j&&a[i]<=pivot) i++; a[j]=a[i]; } a[i]=pivot; return i; //返回pivot(即mid值)的下标}int BFPTR(int a[],int l,int r,int k){ int mid=Find_mid(a,l,r); //寻找中位数的中位数 int pos=Find_pos(a,l,r,mid); //找到中位数的中位数在a中的下标 int i=Partion(a,l,r,pos); int m=i-l+1; //m即为mid归位后在a中的位置 if(m==k) return a[i]; if(m>k) return BFPTR(a,l,i-1,k); return BFPTR(a,i+1,r,k-m);}int main(){ while(cin>>n) { for(int i=0;i<n;i++) cin>>a[i]; cin>>k; cout<<"The "<<k<<" number in the array is:"<<BFPTR(a,0,n-1,k)<<endl; for(int i=0;i<n;i++) cout<<a[i]<<" "; cout<<endl; } return 0;}/*输入:102 1 3 9 8 0 5 6 4 75输出:The 5 number in the array is:40 1 3 2 4 5 6 7 8 9*/
1 0
- BFPTR算法(中位数的中位数算法)求n个数中第k大的数
- 算法 - 求n个数的中位数(C++)
- 分治算法求N个数中第K小(大)的数
- 算法导论 9.3-7 O(n)时间求最接近中位数的k个数
- bfprt算法,中位数的中位数算法,O(n)时间复杂度求解第k大数
- 算法,求1亿个数的中位数
- 求中位数的O(n)算法
- O(n)时间求最接近中位数的k个数
- O(n)时间求最接近中位数的k个数
- 求n个数中第k大的数、前K大的数、快速排序
- O(n)时间内求无序数组中与中位数最近的k个数
- 算法: 快速求中位数(第k大数)
- 【算法】求第k大的数
- 分治算法之找出2n个数的中位数
- BFPRT(中位数的中位数)算法
- 关于在一个序列中寻找中位数和第K大的数(在两个等长有序数组中寻找中位数)
- 求两个有序数组的中位数(扩展求第k大元素)
- 中位数之第K小的线性选择算法
- What、Why、How?解读Webpack官方文档
- Android listview滚动条隐藏后依然显示
- 将整数A转换为B
- OpenCV【1】---OpenCV2.4.11 Build for QT 5.5.0 of Win7
- 山东省第五届蓝桥杯 ///标题:李白打酒//c/c++组
- BFPTR算法(中位数的中位数算法)求n个数中第k大的数
- HDU 1756 Cupid's Arrow(判断点是否在任意多边形上且包括边)
- restart css3 animation
- UINavigationBar属性设置
- APP发布过程中的小问题
- python的urllib和urllib2的区别
- Viewpager的监听事件
- 组合问题
- 华为机试day1