您的位置:首页 > 其它

基于快速排序的快速选择

2009-08-15 10:44 183 查看
#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个函数是否值得……
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐