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