2016-12-03 112 views
-1

我正在嘗試在C中創建一個數組分類器;但它不起作用,我真的不明白爲什麼,所以我要求你幫忙。按照C中的上位順序進行數組排序

for(j=0;j<taille;j++){ 
    for(i=j; i<taille -1;i++){ 

     imin = j; 
     nbmin = tableau[j]; 

     if (tableau[i+1]<nbmin){ 

      imin = i+1; // on stocke l'indice de la plus petite variable 
      nbmin = tableau[i+1]; // on stocke la plus petite variable dans une variable intermédiaire 
     } 
     tableau[imin] = tableau[j]; // prend la dernière case non triée pour la mettre à l'endroit de la plus petite case du tableau 
     tableau[j] = nbmin; // la dernière case non triée contient la plus petite valeur non triée -> la cse est donc triée 

    } 
} 

感謝您的幫助!

+3

請使用英語,不是每個人都懂法語。 –

+1

某些變量在不應該(如imin,nbmin被重置爲每個j)時被重置 –

+0

代碼看起來很好,你得到了什麼輸出?你能在這裏複製嗎? –

回答

0

在外部循環的每次迭代中,您要確定子陣列的最小元素[j ... taille]並將其複製到前面。您使用的算法很簡單:

  • 最低初始化的第一個元素
  • 看看剩餘的元素找到最低
  • 交換與最低

內的第一個元素循環結束i是列表中的第二項,但在您的實現中,初始化和交換髮生在該循環內。

您的代碼應該是這樣的:

for(j = 0; j < taille; j++) { 
    int imin = j;       // initialise minimum 
    int nbmin = tableau[j]; 

    for(i = j + 1; i < taille; i++) {  // find minimum 
     if (tableau[i] < nbmin) { 
      imin = i; 
      nbmin = tableau[i]; 
     } 
    } 

    tableau[imin] = tableau[j];    // swap elements 
    tableau[j] = nbmin; 
} 

(我也改變了內部指標,讓你看的,而不是元素tableau[i + 1],我覺得更多的自然元素tableau[i]和我的一切。作出描述外環最小局部變量。)

+0

嗯,我的代碼終於工作了,我沒有改變它,所以,感謝您的幫助,但我比以前丟失的更多:') –

+0

嗯,你的代碼工作,但它做了太多的工作。您可能想要執行的選擇排序如上所述。它每次迭代至多進行一次交換。你有效地使用'tableau [j]'來存儲最小值,在每次內部迭代之後,將位置'j'的最小值留給你。你在每個內部迭代中重置'imin',然後覆蓋它然後交換。這與「if」條件中的交換大致相同。 (我差不多說了,因爲即使位置相同,你的代碼也會交換。) –

+0

我想代碼不起作用的變體是交換/分配發生在內部循環之外的變體。在這種情況下,索引很可能是錯誤的,因爲它在每個內部循環中被重置。如果你想了解你的算法做什麼,創建一個小數組,例如4個項目,並在每次迭代後打印它。或者,當然,使用調試器。 –

0

我想你想使用選擇排序(wiki page)。

這個想法是找到每個通行證中的最小項目並將其放在正確的位置。

這是一個代碼片段給你的想法。變量聲明和swap例程被跳過。

for (i = 0; i < n - 1; i++) 
{ 
    min_index = i; 
    for (j = i + 1; j < n; j++) 
     if (array[j] < array[min_index]) 
      min_index = j; 

    if (min_index != i) 
     swap(array[i], array[min_index]); 
} 
相關問題