Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C中查找数组中最大的十个数字_C_Arrays_Algorithm_Max - Fatal编程技术网

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

在C中查找数组中最大的十个数字,c,arrays,algorithm,max,C,Arrays,Algorithm,Max,我有一个int数组(数组的长度可以从11到500),我需要在另一个数组中提取最大的10个数字 因此,我的起始代码可能是: 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

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

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

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)
arrayNumbers[n]//用数字输入数组,11。保持堆的大小为10,忽略所有溢出的元素。如果你遇到困难,请问

编辑: 如果元素数小于20,则查找n-10个最小元素,如果数字为前10个,则其余元素

EDIT2:根据Sleepy head的评论,我搜索并找到了(我还没有测试)。您可以在(n)时间内找到第k个最大元素(本例中为10)。现在在O(n)时间内,你可以找到前10个大于或等于第k个最大数的元素。最终的复杂性是线性的。

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

编辑: 如果元素数小于20,则查找n-10个最小元素,如果数字为前10个,则其余元素


EDIT2:根据Sleepy head的评论,我搜索并找到了(我还没有测试)。您可以在(n)时间内找到第k个最大元素(本例中为10)。现在在O(n)时间内,你可以找到前10个大于或等于第k个最大数的元素。最后的复杂度是线性的。

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

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

您可以使用“选择”算法查找第i个最大的数字(您可以将任意数字替换为i)然后迭代数组,找到比i大的数。在您的情况下,i=10当然。

您可以使用“选择”算法,找到第i个最大的数字(您可以输入任何您喜欢的数字,而不是i),然后迭代数组并找到大于i的数字。当然,在你的例子中,i=10。

这里有一个在线性时间内求解的算法:

  • 使用,可以在线性时间内有效地查找未排序数组中的第k个元素。您可以使用快速排序的变体,也可以使用更健壮的算法

  • 使用步骤1中获得的枢轴获取顶部k


  • 以下是一个在线性时间内求解的算法:

  • 使用,可以在线性时间内有效地查找未排序数组中的第k个元素。您可以使用快速排序的变体,也可以使用更健壮的算法

  • 使用步骤1中获得的枢轴获取顶部k


  • 下面的示例可以帮助您。它将原始数组中最大的10个元素排列到arrMax中,假设原始数组arrNum中有所有正数。基于此,您还可以通过使用可能最小的数字初始化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();
    }
    
    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;
    clrsc();
    对于(cur=0;cur=0;pos--)
    
    如果(arrMax[pos]以下示例可以帮助您。它将原始数组中最大的10个元素排列到arrMax中,前提是原始数组arrNum中有所有正数。基于此,您还可以通过使用可能最小的数字初始化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();
    }
    
    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;
    clrsc();
    对于(cur=0;cur=0;pos--)
    
    如果(arrMax[pos]在提高算法的效率时,最好(也是有启发性的)从一个幼稚的实现开始并加以改进。因为在你的问题中,你显然连这个都没有,效率可能是一个没有意义的问题

    如果您从如何查找最大整数这一更简单的问题开始:

  • 将找到的最大值初始化为INT\u MIN
  • 使用以下命令迭代数组:

    如果值>找到的最大值,则找到的最大值=值

  • 要获得10个最大值,请执行相同的算法10次,但保留上一次迭代中的最后一个最大值及其索引,修改找到的最大值测试,如下所示:

    IF value > largest_found && 
       value <= last_largest_found &&
       index != last_largest_index 
    THEN
       largest_found = last_largest_found = value
       last_largest_index = index
    
    如果值>找到的最大值&&
    
    值当提高算法的效率时,通常最好(也是有启发性的)从一个简单的实现开始并改进它。因为在你的问题中,你显然连这个都没有,效率可能是一个没有意义的问题

    如果您从如何查找最大整数这一更简单的问题开始:

  • 将找到的最大值初始化为INT\u MIN
  • 使用以下命令迭代数组:

    如果值>找到的最大值,则找到的最大值=值

  • 要获得10个最大值,请执行相同的算法10次,但保留上一次迭代中的最后一个最大值及其索引,修改找到的最大值测试,如下所示:

    IF value > largest_found && 
       value <= last_largest_found &&
       index != last_largest_index 
    THEN
       largest_found = last_largest_found = value
       last_largest_index = index
    
    如果值>找到的最大值&&
    这是我的想法:

  • 将arrayNum的前10个元素插入arrMax
  • 对这10个元素进行排序,arrMax[0]=min,arrMax[9]=max
  • 然后逐个检查其余元素,并将每个可能的候选元素插入其正确位置,如下所示(草稿):
  • int 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!
    
    for(int k=10;karrNum[k])break;//插入新角点的位置
    如果(r==10)break;//不要超过arrMax的长度
    else r++;//迭代
    }
    if(r!=0)//无需插入小于所有成员的数字
    {
    对于(p=0;p这是我的想法:

  • 将arrayNum的前10个元素插入arrMax
  • 对这10个元素进行排序,arrMax[0]=min,arrMax[9]=max
  • 然后检查rema