基于快速排序的快速选择
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个函数是否值得……
相关文章推荐
- ReviewForJob——快速排序(基于插入排序)+快速选择(快速排序变体)
- 基于快速排序的快速选择
- 【数据结构笔记】快速排序(quick_sort)和快速选择(quick_select)--Python2.7
- 算法兴趣----- 一亿数据获取前100个最大值(仅供参考,基于快速排序的实现时间不稳定,基于最小堆实现。如果我们只要求前K个最大(小)值的时候,用堆是最好的选择,因为这里不用每次都排序了)
- Python实现冒泡排序、选择排序、插入排序、快速排序、归并排序、二分法查找算法(基于《算法导论》伪代码)
- 快速排序和快速选择
- 快速选择排序(quickselect)--基于quicksort
- 基于英文单词的快速HASH索引算法--选择自 tarkey 的 Blog
- 快速排序及快速选择终极版
- 算法实践篇-基于快速排序原理的选择第i小元选择算法
- 快速排序及快速选择问题
- DataGrid基于Access的快速分页法
- 基于deep learning的快速图像检索(Deep Learning of Binary Hash Codes for Fast Image Retrieval)
- 排序算法--快速选择
- 对常见排序算法的总结(选择、插入、希尔、归并、快速、堆排序)
- Java-十种内部排序实现(选择,冒泡,插入,希尔,堆,归并,快速,基数,计数,桶)及代码下载
- OpenJWeb快速开发平台自动创建基于事务的业务逻辑接口和实现类
- java:四种int【】数据排序,冒泡,插入,选择,快速排序
- 基于EasyUi的快速开发框架
- APP Inventor,一个能快速做出app的工具。只要会C语言就行,很好的调试单片机工具。基于arduino的蓝牙数据传送在APP显示,室内花园的制作。