2013-11-14 46 views
0

我正在嘗試使用while創建氣泡排序。我已經在下面發佈了我的課程。爲什麼在這種排序中不顯示9的最後一個int。使用while循環進行氣泡排序。最後一種排序不存在輸出

namespace BubbleSort { 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      int[] i = {9, 2, 7, 6, 1, 3, 5, 4, 8}; 
      int va = 0, vb = 0; 

      //loop through all numbers in the array. 
      while (va < i.Length) 
      { 
       //loop through all numbers in the array trailing the first loop by 1. 
       while (vb < i.Length) 
       { 
        //compare the two values. 
        if (i[vb] < i[va]) { 
         Console.WriteLine(vb); 
        }      
        vb++; //increment 
       }     
       va++; //increment 
      } 
      Console.ReadLine(); 
     } 
    } 
} 

該方法是否正確?

+0

你想使用氣泡排序的特定原因嗎?爲什麼不只是i.OrderBy(x => x); –

+0

這不是一個冒泡排序,另外你輸出的索引,而不是價值。泡泡排序涉及多次傳遞 –

+0

i.Length是9,你正在增加一個打印vb,而它比i.Length更小,所以你永遠不會打印出一個9. – Jonny

回答

1

沒有那不是一個冒泡排序,另外你輸出數組的索引,而不是價值。見Wikipedia FO的交代

你想要更多的東西一樣:

int[] i = {9, 2, 7, 6, 1, 3, 5, 4, 8}; 
    int va = 0; 

    bool swapped = true; 

    while (swapped) { 

    swapped=false; 
    va = 0; 
    //loop through all numbers in the array. 
    while (va < i.Length -1) 
    { 
      //compare the two values. 
      if (i[va] > i[va+1]) { 

       int swap = i[va]; 
       i[va] = i[va+1]; 
       i[va+1] = swap; 
       swapped=true; 
      } 

     //increment 
     va++; 
    } 
} 

然後i進行排序。

順便說一句,這是次優,你可以使用循環的第N階段優化和更好的算法

更優化的版本,一個for循環可能是

int[] i = {9, 2, 7, 6, 1, 3, 5, 4, 8}; 

int n = i.Length -1; 
bool swapped = true; 

for (int n = i.Length - 1; swapped && n > 0; n--) { 
    swapped = false; 
    for (int va=0; va < n; va++) { 
     if (i[va] > i[va+1]) { 
      int swap = i[va]; 
      i[va] = i[va+1]; 
      i[va+1] = swap; 
      swapped=true; 
     } 
    } 
} 
0

這不是冒泡排序確實如此。泡泡排序使用多次通過,改變列表中的項目的位置進行排序。你只需瀏覽你的名單,並在每個循環中挑選小數值。

要回答你的問題:

i[vb] < i[va] 

我[0]是9.是從未小於任何您的其他項目的,所以它永遠不會得到打印。

編輯

當然,是的。正在打印索引。有趣的是,我沒有看到VB在任何時候被重置爲0? 那麼,讓我們說,我很困惑,爲什麼有人會認爲這是一個排序算法:)

+0

實際上9從不打印,因爲數組中只有8個其他條目。如果你用三個零填充數組,你會在輸出中得到9,10和11。 –

+0

忽略_index_確實印出的事實。 – oerkelens

2

總之,沒有。你實際上沒有分類任何東西。下面是你的代碼會發生什麼:

  • 您可以設置vavb到零,然後輸入你的兩個while循環
  • 內循環的第一次迭代數組中比較i[0]每個值
  • i[vb] < i[va]回報falsevb == 0(因爲9不小於9)所以什麼都不顯示
  • vb遞增
  • 內部循環的其餘部分完成。由於數組中的每個其他值爲小於9,它們都會輸出一個值,但輸出的值實際上是vb不是數組中的值。你的循環從08,你跳過第一個值,因爲它是陣列中最高的 - 因此你在內部循環中輸出數字18
  • 內環與vb集到9
  • 您的外環增量va完成,並重復
  • vb仍然設置爲9等內環完全跳過
  • 上述兩個步驟重複進行,直到va達到9,此時代碼完成。

如果你使用不同的數組作爲輸入,你會看到你得到一個完全不同的結果。例如,如果從陣列的前面刪除9,則只能得到3作爲輸出(因爲只有i[3]小於第一個值2)。如果你用三個零值填充你的數組,你實際上會得到9,10和11的輸出,因爲你輸出的是計數器/索引值而不是實際的排序值。

0
public static void BubbleSort(int[] arr) 
{ 
    for (int i = 0 ; i < arr.Length; i++) 
    { 
     for (int j = i + 1 ; j< arr.Length; j++) 
     { 
      if (arr[i] > arr[j]) 
      { 
       int tmp = arr[i]; 
       arr[i] = arr[j]; 
       arr[j] = tmp; 
      } 
     } 
    } 

    Console.WriteLine(String.Join(", ", arr)); 
} 
+0

這不是一個選擇排序而不是泡沫的變化嗎? –

+0

可能,自從我寫了任何排序算法以來,已經有10年了:) –