我要从大约20个数里面找出最大的3个数,所以我自己改写了一份code。我手动输入10个数字,然后希望输出3个最大的数字,但是结果只有最大的数字是正确的,第二个和第三个都是不对的,不知道哪个环节出了问题,很是纳闷,欢迎大家的建议。 圣诞节快乐
[解决办法]
用快速查找,类似于快速排序,但是效率要比排序高。因为你只要求找到 最大的三个数,不一定有序。
[解决办法]
#define N 3
#define Maxnumber 10
int main()
{
int i,j;
int area;
int maxArea[N];
int Date[Maxnumber];
int empty = N;
for(j=0;j<Maxnumber;j++)
{
printf("Input:");
scanf("%d",&area);
printf("\n");
Date[j] = area;
/* if(empty > 0)
{
maxArea[N-empty]=area;
empty=empty-1;
}
else
{
for(i=0; i < N; i=i+1)
{
if(area>maxArea[i])
{
maxArea[i]=area;
break;
}
}
}*/
}
//这就是传说中的冒泡排序
for(int i=0; i<Maxnumber; i++)
{
for(int j=1; j<Maxnumber; j++)
{
if(Date[j-1] < Date[j])
{
int temp = Date[j-1];
Date[j-1] = Date[j];
Date[j] = temp;
}
}
}
printf("Area1=%d\n",Date[0]);
printf("Area2=%d\n",Date[1]);
printf("Area3=%d\n",Date[2]);
system("pause");
[解决办法]
这种思路是最简单的了 因为你的数据量本来就很小 这个方法解决是绝对没问题的
当然2楼的方法也OK 但是你数据量那么小 没必要那么做 还可以利用算法导论中的顺序统计量树 可以随意取出第n大的数 但那就更没必要 所以这里你还是用冒泡排序就可以了
[解决办法]
做什么事情都需要有最坏的打算,数据量大的时候排序是完全没有必要的,因为只需要求前几个最大的数
随便写了个随机求第K大的数的程序
#include <stdio.h>
#include <time.h>
#define SWAP(x, y) {int t; t=x; x=y; y=t;}
int partition(int a[], int p, int r)
{
int x = a[r];
int i = p-1, j;
for(j = p; j <= r-1; j++)
{
if(a[j] <= x)
{
i++;
SWAP(a[i], a[j]);
}
}
SWAP(a[i+1], a[r]);
return i+1;
}
int randomized_partiton(int a[], int p, int r)
{
int x = rand()%r;
int temp;
temp = x+p > r ? x: x+p;
SWAP(a[temp], a[r]);
return partition(a, p, r);
}
int randomized_select(int a[], int p, int r, int i)
{
int q, k;
// 检测程序只有一个元素的情况
if(p==r)
return a[p];
q = randomized_partiton(a, p, r);
k = q - p+1;
if(i==k)
return a[q];
else if(i < k)
return randomized_select(a, p, q-1, i);
else
return randomized_select(a, q+1, r, i-k);
}
int main()
{
int a[10]={3,1,5,7,8,2,4,6,10,9};
int x;
int size=10; // 要选取多大的值,10为最大的值,1为最小的值
srand(time(NULL));
x = randomized_select(a, 0, 9, size);
printf("%d\n", x);
system("pause");
return 0;
}