C中的选择排序......不起作用

时间:2015-02-11 04:48:13

标签: arrays sorting

我是编程新手,目前我正在尝试为递归中的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;
}

3 个答案:

答案 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是指针的大小(好吧,至少在我的机器上)。

你的main函数中的

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;
}