#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
#define LEN 14
void swop(int *a,int *b)
{
int temp=*a;
*a=*b;
*b=temp;
}
int partition(int a[],int p,int r)
{
int i=p-1,x=a[r],j;
for(j=p;j<r;j++)
{
if(a[j]<x)
{
i++;
swop(&a[i],&a[j]);
}
}
swop(&a[r],&a[i+1]);
return i+1;
}
int at(int a[],int p,int r,int i)
{
if(p==r)
{
return a[p];
}
int q=partition(a,p,r);
int k=q-p+1;
if(i==k)
return a[q];
else if(i<k)
return at(a,p,q-1,i);
else
return at(a,q+1,r,i-k);
}
void getKths(int a[],int p,int r,int k,int n1,int n2,int passout[])
{
if(n2<n1 || r-p+1<k)
return;
int n=(n1+n2)/2;
int k1=at(a,p,r,k);
passout[n]=k1;
if(n2>n1)
{
getKths(a,p,n*k,k,n1,n,passout);
getKths(a,n*k+1,r,k,n+1,n2,passout);
}
}
void printA(int a[],int len)
{
for(int i=1;i<len;i++)
{
printf("%d ",a[i]);
}
printf("\n");
}
void main()
{
int k=3;
int a[LEN]={INT_MIN,2,8,9,3,4,6,5,7,1,10,11,12,13};
int count=(LEN-1)/k;
int *b=(int*)malloc((count+1)*sizeof(int));
getKths(a,1,LEN-1,k,1,count,b);
printA(b,count+1);
getchar();
}
算法导论 练习题 9.3-6
最新推荐文章于 2017-04-21 10:41:03 发布