在《算法导论》中看到的,自己实现了一下。
#include <cstdio>
#include <windows.h>
#include <time.h>
void swap(int *a,int *b)
{
int c=*a;
*a=*b;
*b=c;
}
int* Random_Selector(int *Left,int *Right)
{
int Average=*(Left+rand()%(Right-Left+1)-1);
while(Left<Right){
while(Left<Right&&(*Left)<=Average)Left++;
while(Left<Right&&(*Right)>=Average)Right--;
if(Left<Right)swap(Left,Right);
}
return Left<Right?Left:Right;
}
int* SearchIndex(int *Left,int *Right,int index)
{
int* r=Random_Selector(Left,Right);
if(r-Left==index-1)return r;
if(r-Left<index-1)return SearchIndex(r,Right,index-(r-Left));
return SearchIndex(Left,r-1,index);
}
void initialize()
{
srand(time(0));
}
int main()
{
initialize();
int index=0;
int test[]={1,2,3,4,5,6,7,8,9};
int *r;
while(++index!=10){
r=SearchIndex(test,test+8,index);
printf("Index %d is %d\n",index,*r);
}
return 0;
}