繁体   English   中英

在C中找到数组中最大的十个数字

[英]find the largest ten numbers in an array in C

我有一个整数数组(数组的长度可以从11到500),并且我需要在另一个数组中提取最大的十个数字。

因此,我的起始代码可能是这样的:

arrayNumbers[n]; //array in input with numbers, 11<n<500

int arrayMax[10];

for (int i=0; i<n; i++){

    if(arrayNumbers[i] ....

    //here, i need the code to save current int in arrayMax correctly
}

//at the end of cycle, i want to have in arrayMax, the ten largest numbers (they haven't to be ordered)

用C做到这一点的最佳有效方法是什么?

研究maxheap 保持大小为10的堆,并忽略所有溢出元素。 如果您遇到困难,请询问。

编辑:如果元素数少于20,找到n-10个最小的元素,如果数字是前10位,则休息。

在这里可视化堆

EDIT2:基于Sleepy头的评论,我搜索并找到了这个 (我尚未测试)。 您可以在)(n)时间找到第k个最大元素(在这种情况下为10)。 现在,您可以在O(n)时间中找到前10个大于或等于第k个最大数字的元素。 最终复杂度是线性的。

这是一个求解线性时间的算法:

  1. 使用选择算法 ,可以在线性时间内有效地在未排序的数组中找到第k个元素。 您可以使用快速排序的变体,也可以使用更强大的算法。

  2. 使用步骤1中获得的枢轴获取顶部k。

这是我的主意:

  1. 将arrayNum的前10个元素插入arrMax。
  2. 对这10个元素进行排序arrMax [0] = min,arrMax [9] = max。
  3. 然后依次检查其余元素,然后将每个可能的候选元素插入其正确位置,如下所示(草稿):

整数k,r,p;

    for (int k = 10; k < n; k++)
   {
    r = 0;
    while(1)
    {
    if (arrMax[r] > arrNum[k]) break; // position to insert new comer
    else if (r == 10) break;  // don't exceed length of arrMax
    else r++;                 // iteration
    }

    if (r != 0)  // no need to insert number smaller than all members
    {
     for (p=0; p<r-1; p++) arrMax[p]=arrMax[p+1]; // shift arrMax to make space for new comer
     arrMax[r-1] = arrNum[k]; // insert new comer at it's position
    }
   } // done!

对数组排序并在另一个数组中插入最多10个元素

您可以使用“选择”算法找到您的第i个最大数字(您可以输入任意数字而不是i),然后遍历数组并查找大于i的数字。 在您的情况下,我当然是10。

以下示例可以为您提供帮助。 假设您在原始数组arrNum中具有所有正数,则它将原始数组的最大10个元素排列到arrMax中 基于此,您还可以通过使用可能的最小数字初始化arrMax的所有元素来处理负数

无论如何,使用一个包含10个元素的堆比这是一个更好的解决方案。

void main()
{
int arrNum[500]={1,2,3,21,34,4,5,6,7,87,8,9,10,11,12,13,14,15,16,17,18,19,20};
int arrMax[10]={0};

int i,cur,j,nn=23,pos;
clrscr();

for(cur=0;cur<nn;cur++)
{
    for(pos=9;pos>=0;pos--)
       if(arrMax[pos]<arrNum[cur])
         break;
    for(j=1;j<=pos;j++)
       arrMax[j-1]=arrMax[j];
    if(pos>=0)
       arrMax[pos]=arrNum[cur];
}

for(i=0;i<10;i++)
   printf("%d ",arrMax[i]);

getch();
}

在提高算法效率时,从幼稚的实现入手并对其进行改进通常是最好的(有启发性的)。 因为在您的问题中您显然没有,效率可能是一个有争议的话题。

如果从关于如何找到最大整数的简单问题开始:

  1. 将maximum_found初始化为INT_MIN
  2. 使用以下方法迭代数组:

    如果值> maximum_found那么THEn large_found =值

要获得最大的10个值,您需要执行10次相同的算法,但是要保留last_largest及其上次迭代的索引,因此可以修改maximum_found测试:

IF value > largest_found && 
   value <= last_largest_found &&
   index != last_largest_index 
THEN
   largest_found = last_largest_found = value
   last_largest_index = index

首先,然后问自己(或这里)关于效率的问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM