读书人

从K个数里边找出最大的N个数圣诞快乐

发布时间: 2013-12-26 15:24:01 作者: rapoo

从K个数里面找出最大的N个数,圣诞快乐!
我要从大约20个数里面找出最大的3个数,所以我自己改写了一份code。我手动输入10个数字,然后希望输出3个最大的数字,但是结果只有最大的数字是正确的,第二个和第三个都是不对的,不知道哪个环节出了问题,很是纳闷,欢迎大家的建议。 圣诞节快乐


#include <stdio.h>
#define N 3

int main()
{
int i,j;
int area;
int maxArea[N];
int empty = N;

for(j=0;j<10;j=j+1)
{
printf("Input:");
scanf("%d",&area);
printf("\n");

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;
}
}
}
}
printf("Area1=%d\n",maxArea[0]);
printf("Area2=%d\n",maxArea[1]);
printf("Area3=%d\n",maxArea[2]);
}

[解决办法]
搜 最大堆...
[解决办法]
1、声明一个20个元素的数组;
2、每输入一个数后,将这个数插入到数组中;
3、最后输出前3个元素即可。
其中第1和2步实际上是很自然的完成插入排序的过程。

引用:
我要从大约20个数里面找出最大的3个数,所以我自己改写了一份code。我手动输入10个数字,然后希望输出3个最大的数字,但是结果只有最大的数字是正确的,第二个和第三个都是不对的,不知道哪个环节出了问题,很是纳闷,欢迎大家的建议。 圣诞节快乐


#include <stdio.h>
#define N 3

int main()
{
int i,j;
int area;
int maxArea[N];
int empty = N;

for(j=0;j<10;j=j+1)
{
printf("Input:");
scanf("%d",&area);
printf("\n");

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;
}
}
}
}


printf("Area1=%d\n",maxArea[0]);
printf("Area2=%d\n",maxArea[1]);
printf("Area3=%d\n",maxArea[2]);
}


[解决办法]
按照从大到小的顺序插入到数组的合适位置,看一下插入排序就清楚了。
比如最初数组中的数据是:20 13 6 4
这时你输入的是:8
这样你一路比较过来,发现8比13小,比6大,所以插入进来变成:20 13 8 6 4,
这样全部数据输完,其实都已经排好顺序了。




Quote: 引用:

1、声明一个20个元素的数组;
2、每输入一个数后,将这个数插入到数组中;
3、最后输出前3个元素即可。
其中第1和2步实际上是很自然的完成插入排序的过程。

Quote: 引用:

我要从大约20个数里面找出最大的3个数,所以我自己改写了一份code。我手动输入10个数字,然后希望输出3个最大的数字,但是结果只有最大的数字是正确的,第二个和第三个都是不对的,不知道哪个环节出了问题,很是纳闷,欢迎大家的建议。 圣诞节快乐


[解决办法]
引用:
我要从大约20个数里面找出最大的3个数,所以我自己改写了一份code。我手动输入10个数字,然后希望输出3个最大的数字,但是结果只有最大的数字是正确的,第二个和第三个都是不对的,不知道哪个环节出了问题,很是纳闷,欢迎大家的建议。 圣诞节快乐


#include <stdio.h>
#define N 3

int main()
{
int i,j;
int area;
int maxArea[N];
int empty = N;

for(j=0;j<10;j=j+1)
{
printf("Input:");
scanf("%d",&area);
printf("\n");

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;
}
}
}
}
printf("Area1=%d\n",maxArea[0]);
printf("Area2=%d\n",maxArea[1]);
printf("Area3=%d\n",maxArea[2]);
}

用快速查找,类似于快速排序,但是效率要比排序高。因为你只要求找到 最大的三个数,不一定有序。
[解决办法]
#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");

[解决办法]
引用:
逻辑根本不对,自己单步一下不就知道了?
最简单写个冒泡排序就ok了


这种思路是最简单的了 因为你的数据量本来就很小 这个方法解决是绝对没问题的
当然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;
}

读书人网 >C语言

热点推荐