
对于乱序数组,得到排序后第k个数字的算法复杂度为O(lgn) 。参考快速排序。
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int a[11]= {
1,3,5,7,9,2,4,6,8,10
} ;
int getkthValue(int low,int high,int k)
{
int q=a[low];
int ll=low,hh=high;
if(low==high && low==k) return a[low];
while(ll<hh)
{
while(ll<hh)
if(a[hh]>q)
hh--;
else {
a[ll]=a[hh];
ll++;
break;
}
while(ll<hh)
if(a[ll]<q)
ll++;
else {
a[hh]=a[ll];
hh--;
break;
}
}
a[ll]=q;
if(ll==k) return q;
else if(ll>k) return getkthValue(low,ll-1,k);
else if(ll<k) return getkthValue(ll+1,high,k);
}
int main() {
int n=11;
int k;
k=n/2;
int v=getkthValue(0,n-1,k);
int s1=0,s2=0;
for(int i=0; i<n; i++)
{
if(a[i]<v) s1+=a[i];
else s2+=a[i];
}
cout<<"|s2-s1|="<<s2-s1<<endl;
return s2-s1;
}