按照算法导论(3th 中文)Page123上的步骤、
代码比较乱、
#include <iostream>
using namespace std;
void exchange(int &a, int &b)
{
int temp;
temp = a;
a = b;
b = temp;
}
int partition(int A[],int p, int r, int key)
{
int i = p - 1,j;
for(j=p;j<r; ++j)
if(A[j]==key)
break;
exchange(A[j],A[r]);
for(j=p; j<r; ++j)
{
if(A[j]<=key){
i++;
exchange(A[i],A[j]);
}
}
exchange(A[i+1],A[r]);
return i+1-(p-1);
}
void insert_sort(int A[],int p, int r)
{
if(p>=r)
return;
int key,i,j;
for(j=p+1;j<=r; j++)
{
key = A[j];i=j-1;
while(i>=p && A[i]>key)
{
A[i+1] = A[i];
i = i-1;
}
A[i+1] = key;
}
}
int select(int A[],int p, int r, int i)
{
if(p==r)
return A[p];
int k = p+4;
while(k<=r)
{
insert_sort(A, k-4, k);
k += 5;
}
insert_sort(A, k-4, r);
int num;
num = (r-p+1)/5 + ( (r-p+1)%5 ? 1:0 );
int *new_arr = new int[num];
for(int j=0;j<num-1;++j)
new_arr[j] = A[3+j*5+p-1];
//找出最后一个中位数
k = r-(num-1)*5 - (p - 1);
if(k%2)k = k + 1;
k = k/2;
k += (num-1)*5 + p - 1;
new_arr[num-1] = A[k];
//对[n/5]个中位数进行插入排序,找出中位数的中位数x
insert_sort(new_arr, 0, num-1);
int x = new_arr[(num-1)/2];
delete new_arr;
//按中位数x对输入数组进行划分
k = partition(A,p,r,x);
if(k==i)
return x;
else if(k>i)
select( A, p, k-1 + (p-1), i);
else
select( A, k+1 + (p-1), r, i-k);
}
void test()
{
int A[] = {0,50,90,100,70,30,20,40,60,80,10};
for(int i = 1; i<=10; ++i)
cout<<select(A,1,10,i)<<" ";
cout<<endl;
}
int main()
{
test();
return 0;
}