[英]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做到这一点的最佳有效方法是什么?
这是一个求解线性时间的算法:
使用选择算法 ,可以在线性时间内有效地在未排序的数组中找到第k个元素。 您可以使用快速排序的变体,也可以使用更强大的算法。
使用步骤1中获得的枢轴获取顶部k。
这是我的主意:
整数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();
}
在提高算法效率时,从幼稚的实现入手并对其进行改进通常是最好的(有启发性的)。 因为在您的问题中您显然没有,效率可能是一个有争议的话题。
如果从关于如何找到最大整数的简单问题开始:
使用以下方法迭代数组:
如果值> 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.