您的位置:首页 > 其它

快速排序查找 N个整数中,找到前M(M<<N)个最大的数字

2015-03-20 15:43 447 查看
/**<
N个整数中,找到前M(M<<N)个最大的数字
*/

#include <iostream>
#include <cstdio>
#include <ctime>
using namespace std;
#define N 100
int arr
;
void initArr(int *arr,int n);
void findMmax(int *arr,int n,int m);
void Print(int *arr,int i,int j);
int Partition(int *arr,int i,int j,int tar);
int main()
{
int n,m;
while(scanf("%d%d",&n,&m)==2)
{
if(n<m)
{
puts(" n >= m");
continue;
}
initArr(arr,n);
Print(arr,0,n-1);
findMmax(arr, n, m);
Print(arr,n-m,n-1);
}
return 0;
}
void initArr(int *arr,int n)
{
srand(time(NULL));
int i=0;
for(;i<n;++i)
{
arr[i]=rand()%N+i;
}
}
void Print(int *arr,int i,int j)
{
for(;i<=j;++i)
{
printf("%d ",arr[i]);
}
puts("");
}
int Partition(int *arr,int i,int j,int tar)
{
int pivort = arr[i];
while(i<j)
{
while(i<j && arr[j]>=pivort) --j;
arr[i] = arr[j];
while(i<j && arr[i]<=pivort) ++i;
arr[j] = arr[i];
}
arr[i] = pivort;
return i;
}
void findMmax(int *arr,int n,int m)
{
int pt = Partition(arr,0,n-1,n-m);
int tar = n-m;
while(pt!=tar)
{
if(pt>tar)
pt =  Partition(arr,0,pt-1,tar);
else if(pt<tar)
pt =  Partition(arr,pt+1,n-1,tar);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐