我是编程新手,目前我正在尝试为递归中的Selection Sort编写算法。我试图将数组[10]传递给我在main函数之前定义的选择排序函数,而选择排序函数调用另一个函数。在编译之后,它不会出于某种原因对数组进行排序。相反,它会在数组的开头添加一个整数。我无法弄清楚出了什么问题......
void helper_func(int arr[],int x,int y)
{
int tmp=0;
if(y<= (sizeof(arr))/(sizeof(int)))
{
if(arr[x]>arr[y])
{
tmp=arr[x];
arr[x]=arr[y];
arr[y]=tmp;
}
y=y+1;
helper_func(arr,x,y);
}
}
void SelectionSort(int arr[], int len)
{
if (len>1)
{
int x=sizeof(arr)/sizeof(int)-len;
int y=x;
helper_func(arr,x,y);
len=len-1;
SelectionSort(arr,len);
}
}
int main()
{
int array_a[10]={10,9,8,7,6,5,4,3,2,1};
SelectionSort(array_a, 10);
int x=0;
for(x=0;x<=sizeof(array_a)/sizeof(int)-1;x++)//checking what is in the arry
{
printf("%d...",array_a[x]);
}
return 0;
}
答案 0 :(得分:1)
“如果处理未作为参数接收的数组,sizeof方式是正确的方法。作为参数发送到函数的数组被视为指针,因此sizeof将返回指针的大小,而不是数组的大小。
因此,在内部函数中,此方法不起作用。相反,始终传递一个额外的参数size_t size,表示数组中元素的数量。“
您可以参考此问题:How do I determine the size of my array in C?
在你的情况下,sizeof(arr)返回4,这实际上是指针的大小。
答案 1 :(得分:0)
好吧,问题是您确定数组长度的方法(通过计算sizeof(arr)/sizeof(int)
)不起作用。
这是因为当数组传递给C中的函数时,实际传递的是指向数组的第一个元素的指针。函数sizeof(arr)
和SelectionSort
中的helper_func
将总是返回8,因为8是指针的大小(好吧,至少在我的机器上)。
sizeof(array_a)
可以工作,但这只是因为你在那里声明了数组,并且编译器能够很聪明并告诉你整个数组的大小。
在C这样的数组中,我无法确定传递给函数的数组的长度(即,指向数组的第一个元素的指针),而没有任何其他信息。通常所做的是,当传递数组时,数组的长度只是传递给需要它的函数。
例如,您可以将void SelectionSort(int arr[], int len)
更改为取消SelectionSort(int arr[], int len, int overall_len)
并传递数组的长度。虽然在这种情况下,变量名称令人困惑,但将len
更改为counter
或其他内容可能会更好。您还必须为helper_func
更改此设置。我这样做了,代码工作得更好(尽管你也必须调整你的算法,因为它没有完全正确排序)。
答案 2 :(得分:-1)
试试这个:
for(int x=0; x<n; x++)
{
int index_of_min = x;
for(int y=x; y<n; y++)
{
if(array[index_of_min]>array[y])
{
index_of_min = y;
}
}
int temp = array[x];
array[x] = array[index_of_min];
array[index_of_min] = temp;
}