O(n)求中位数和第k大数
解题关键:模板与思路。面试题
#include<cstdio> #include<cstring> #include<algorithm> #include<cstdlib> #include<iostream> #include<cmath> #include<vector> using namespace std; typedef long long ll; //两种方式求on中位数 int partition(int L[],int l,int r){ int i,num=l; for(i=l+1;i<=r;i++){ if(L[i]<L[l]){ swap(L[i],L[++num]); } } swap(L[l],L[num]); return num; } void getmid(int L[],int l,int r){ int mid=(l+r)/2; while(1){ int pos=partition(L,l,r); if(pos==mid) break; else if(pos>mid) r=pos-1; else l=pos+1; } printf("%d\n",L[mid]); } //得到第k大 int getMinK(int v[], int l, int r, int k){ if(l<r){ int i=l,j=l; for(;j<r;j++){ if(v[j]<v[r]){ swap(v[i++],v[j]); } } swap(v[i],v[r]); if(k==i) return v[i]; else if(k<i) return getMinK(v,l,i-1,k); else return getMinK(v,i+1,r,k); } else return v[l]; } int main(){ int a[]={1,5,3,4,2,4}; getmid(a,0,4); //int ans=getMinK(a,0,4,2); //printf("%d\n",ans); return 0; }