首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

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

2013-12-26 
从K个数里面找出最大的N个数,圣诞快乐!我要从大约20个数里面找出最大的3个数,所以我自己改写了一份code。我

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

热点排行