2015-02-11 68 views
-2

我是編程新手,目前我正在嘗試爲遞歸選擇排序算法。我嘗試將數組[10]傳遞給我在主函數和選擇排序函數調用另一個函數之前定義的選擇排序函數。編譯在此之後,它不排序的數組一些reason..Instead它增加了一個整數放入數組。我一開始無法弄清楚什麼是錯的...選擇排序在C ...不工作

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

回答

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

「如果處理未作爲參數接收的數組,sizeof方法是正確的方法。作爲參數發送到函數的數組被視爲指針,所以sizeof將返回指針的大小,而不是數組的大小。

因此,內部函數此方法不起作用。 d,總是傳遞一個額外的參數size_t大小,指出數組中元素的數量。「

你可以參考這個問題:How do I determine the size of my array in C?

在你的情況的sizeof(ARR)返回4,這實際上是指針的大小。

0

好的,問題是,您確定數組長度的方法(通過計算sizeof(arr)/sizeof(int))不起作用。

這是因爲當數組傳遞給C函數時,實際傳遞的是指向數組的第一個元素的指針。 sizeof(arr)在功能SelectionSorthelper_func總是返回8,因爲8是指針的大小(至少在我的機器上)。

sizeof(array_a)在你的主要函數中工作,但那只是因爲你在那裏聲明瞭數組,而編譯器能夠很聰明並告訴你整個數組的大小。

在C中,對於這樣的數組,我不知道如何確定傳遞給函數的數組長度(即指向數組第一個元素的指針)其他信息。通常做的事情是數組的長度傳遞給需要它的函數。

例如,您可以將void SelectionSort(int arr[], int len)更改爲void SelectionSort(int arr[], int len, int overall_len),並將該陣列的長度與其一起傳遞。雖然在這種情況下,變量名稱很容易混淆,但最好將len更改爲counter或其他內容。您也必須更改helper_func。我這樣做了,代碼運行得更好(儘管你必須調整算法,因爲它沒有正確排序)。

+0

哦,這是一個與問題無關的文體建議,但是您可能需要對其進行標準化,以便SelectionSort和helper_func使用相同的命名約定,與使用camelCase和使用下劃線的命名約定相反。你可以在C中查找一些關於命名約定的東西,那裏有很多文章。 – Nathan 2015-02-11 05:22:07

+0

嗯我明白了。我想知道是否有可能只用遞歸函數編寫算法(不適用於循環或while循環) – GalaxyVintage 2015-02-12 05:34:23

+0

從理論上講,可以用循環完成所有可以用循環完成的任務。 – Nathan 2015-02-12 08:42:32