#include <stdio.h>
#include <xmath.h>
#include <algorithm>
int QuickSelect(int a[], int s, int t, int k);
int main(){
int n=10,k;
int e;
int a[]={2,5,1,7,10,6,9,4,3,8};
for(k=1;k<=n;k++){
e = QuickSelect(a,0,n-1,k);
printf("第%d小的元素:%d\n",k,e);
}
}
int QuickSelect(int a[], int s, int t, int k) {
int i=s,j=t;
int tmp;
if (s<=t){ //区间中存在元素
tmp=a[s]; //区间第一个记录作为基准
while (i!=j){ //从区间两端交替向中间扫描,直到i=j为止。
while(j>i&&a[j]>=tmp)
j--; //从右向左扫描,找到1个关键字小于tmp的a[j]
a[i]=a[j]; //将a[j]移动a[i]的位置
while(i<j&&a[i]<=tmp)
i++; //从左向右扫描,找到1个关键字大于tmp的a[i]
a[j]=a[i]; //将a[i]后移到a[j]的位置
}
a[i]=tmp;
if(k-1==i)return a[i];
else if(k-1<i)return QuickSelect(a,s,i-1,k); //在左区间中递归查找
else
return QuickSelect(a,i+1,t,k); //在右区间中递归查找
}
return 0;
}
寻找一个序列中第k小的元素(快速排序,分治法,C/C++)
最新推荐文章于 2022-03-26 21:27:11 发布