#include <stdio.h> #include <stdlib.h> #include <time.h> #define MAXSIZE 100 #define CUTOFF 3 //#define SELECTNUM 24 //当要求选特定的第K个时,可使用#define typedef int elemtype; void Swap(elemtype *,elemtype *); void InsertSort(elemtype *,int); elemtype median3(elemtype *,int,int); void QSelect(elemtype *,int,int,int); void main(){ elemtype buffer[MAXSIZE]; int i; int selectnum; int low=0; int high=MAXSIZE; srand(time(NULL)); for(i=0;i<MAXSIZE;i++) buffer[i]=rand()%(MAXSIZE*10); selectnum=rand()%MAXSIZE; QSelect(buffer,selectnum,low,high); printf("The %d number is %d/n",selectnum,buffer[selectnum]); } void QSelect(elemtype buffer[],int k,int low,int high){ elemtype pivot; int i,j; if(high-low+1>CUTOFF){ pivot=median3(buffer,low,high); i=low; j=high-1; //MARK! for(;;){ while(buffer[++i]<pivot); while(buffer[--j]<pivot); if(i<j) Swap(&buffer[i],&buffer[j]); else break; }//for Swap(&buffer[i],&buffer[high-1]); //枢纽归位 if(k<=i) QSelect(buffer,k,low,i-1); else if(k>i+1) QSelect(buffer,k,i+1,high); }//if else InsertSort(buffer+low,high-low+1); } elemtype median3(elemtype buffer[],int left,int right){ int center=(left+right)/2; if(buffer[left]>buffer[center]) Swap(&buffer[left],&buffer[center]); //使中间是三者中的中值!MARK! if(buffer[left]>buffer[right]) Swap(&buffer[left],&buffer[right]); if(buffer[right]<buffer[center]) Swap(&buffer[right],&buffer[center]); Swap(&buffer[center],&buffer[right-1]); //将枢纽和最后一个元素交换 return buffer[right-1]; } void Swap(elemtype *st,elemtype *nd){ elemtype tmp; tmp=*st; *st=*nd; *nd=tmp; } void InsertSort(elemtype buffer[],int N){ int j,p; elemtype tmp; for(p=0;p<N;p++){ tmp=buffer[p]; for(j=p;j>0&&buffer[j-1]>tmp;j--) buffer[j]=buffer[j-1]; buffer[j]=tmp; }//for } 有时候就想,就为了一个简简单单的选择而写70多行代码,调用4个函数是否值得……