// RandomizedSelect.cpp : Defines the entry point for the console application.
//
#include <stdafx.h>
#include <stdlib.h>
#include <time.h>
#define MAX 1000
int Partition( int a[], int p, int r )
{
int i = p-1;
while(p != r)
{
if(a[p]>a[r])
{
i++;
int temp = a[i];
a[i]= a[p];
a[p] = temp;
}
p++;
}
int temp = a[i+1];
a[i+1] = a[r];
a[r] = temp;
return i+1;
}
int RandomizedPartition( int a[], int p, int r )
{
int i = rand()%(r-p) + p;
int temp = a[r];
a[r] = a[i];
a[i] = temp;
return Partition(a, p, r);
}
int RandomizedSelect(int a[], int p, int r, int i)
{
if (p == r)
{
return a[r];
}
int q = RandomizedPartition(a, p, r);
int k = q-p+1;
if (k==i)
{
return a[q];
}
else
{
if (i<k)
{
return RandomizedSelect(a,p,q,i);
}
else
{
return RandomizedSelect(a, q+1, r, i-k);
}
}
}
int main(int argc, char* argv[])
{
puts("please input the scale of data:");
int length = 0;
scanf("%d", &length);
int* a = (int *)malloc(length * sizeof(int));
srand(time(0));
int i=0;
puts("the array is:");
for(;i<length;i++)
{
a[i] = rand()%MAX;
printf("%d ", a[i]);
}
puts("\nplease input j:");
int j=0;
scanf("%d", &j);
j = RandomizedSelect(a, 0, length-1, j);
printf("%d", j);
return 0;
}
问题:
1、其实这个算法没有什么问题啦,比较简单的,并且大师的书就是大师,很容易实现,基本上把代码敲上就搞定!
2、有空自己得再好好看看,争取一遍不看书,直接搞定。
3、有些小细节得注意,下标要特别注意~~~