#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(); }