所以,我只是在研究C代码,特别是一个接受3个参数的函数:一个数组,数组的大小,以及你想要返回的最大元素的数量。
这是我的代码:
int* findMaxElements(int base_array[],int size_of_base_array, int number_of_elements_to_find);
int main( void )
{
printf("Find Max Values in an Array\n\n");
// Set up array
int kinch[6] = {1,2,3,4,5,6};
// Pass to function and get a pointer to new array filled with only the max elements
int *given = findMaxElements(kinch,6,3);
for(int i = 0; i < 3; i++)
{
printf("\nMax Value = %d\n", *(given + i));
}
return 0;
}
int* findMaxElements(int base_array[],int size_of_base_array, int number_of_elements_to_find)
{
// Set up all initial variables
int i,k,c,position;
int maximum = 0;
int returnArray[100];
/*Actual Algorythm */
for(i = 0; i < number_of_elements_to_find; i++)
{
// Get the max value in the base array
for(k = 0; k < size_of_base_array; k++)
{
if(base_array[k] > maximum)
{
maximum = base_array[k];
}
}
// Find the position of the max value
for(position = 0; position < size_of_base_array; position++)
{
if(base_array[position] == maximum)
{
break;
}
}
// Delete the maximum value from the array and shift everything
for(c = position - 1; c < size_of_base_array - 1; c++)
{
base_array[c] = base_array[c+1];
}
// Reduce the size of the array
size_of_base_array -= 1;
// Push max value into return array
returnArray[i] = maximum;
// Reset max value
maximum = 0;
}
return returnArray;
}
我感觉功能出错了。
// Set up array
int kinch[6] = {1,2,3,4,5,6};
// Pass to function and get a pointer to new array filled with only the max elements
int *given = findMaxElements(kinch,6,3);
for(int i = 0; i < 3; i++)
{
printf("\nMax Value = %d\n", *(given + i));
}
这应该输出数字6,5和4,因为它们是数组中最大的三个,但是我得到的输出总是6,6和6.它有什么问题?
答案 0 :(得分:2)
一个问题是您在函数中返回指向局部变量returnArray
的指针。你不能可靠地做到这一点 - 它会导致未定义的行为。
也可能存在其他问题,但这足以成为自己的噱头。
答案 1 :(得分:2)
这可能不是你唯一的问题,但在行
for(c = position - 1; c < size_of_base_array - 1; c++)
{
base_array[c] = base_array[c+1];
}
您将[c+1]
(最大值)的元素复制到[c]
- 这样您就可以继续找到最大值...
您应该使用c = position
开始循环,而不是c = position - 1
。
在用于存储返回值的数组前面添加关键字static
,这样它们仍然有效(这是解决Jonathan Leffler确定的问题的一种方法)。
答案 2 :(得分:1)
找到第K个最大元素的整个方法并不高效而优雅。我建议你修改你的算法,虽然有上述建议它可以正常工作,但这不是解决这个问题的好方法。
我建议您查看以下链接以修改您的算法 http://www.geeksforgeeks.org/k-largestor-smallest-elements-in-an-array/