2012-01-27 57 views
1

我目前正在參加一個數據結構和算法課程,並且練習的一部分是實現具有3個for循環的振動篩分算法。在代碼片段中包含了一些我修正的錯誤,但有一件事我不確定爲什麼我得到這個: 當我初始化一個大小爲12的數組時,我的第一個索引值沒有排序,我沒有理解爲什麼。 這是我的代碼:振動篩排序或雙向氣泡排序

// Method which will sort an array by using the shakersort algorithm 
public void shakerSort(int[] array) 
{  

    for (int p = 1; p < array.length-1; p++) 
    { 

     for (int i = p-1; i < array.length-2; i++) 
     {     
      if (array[i] > array[i+1]) 
      { 
       super.swap(array, i, i+1); 
      }    
     } 

     for (int i = array.length-p-1; i > 0; i--) 
     { 
      if (array[i] > array[i+1]) 
      { 
       super.swap(array, i, i+1); 
      } 
     } 

    } 

我的結果是這樣的:

  • 元素0:53
  • 要素1:27
  • 要素2:28
  • 元素3 :53
  • 元素4:90
  • 元素5:72
  • 元素6:80
  • 元素7:67
  • 元8:2
  • 元素9:33
  • 元件10:45
  • 元件11:91
  • 排序後...
  • 元素0:27
  • 要素1:2
  • 要素2:28
  • 要素3:33
  • 元素4:45
  • 元素5:53
  • 元素6:53
  • 元素7:67
  • 元素8:72
  • 元素9:80
  • 元件10:90
  • 元件11:91

感謝您的時間和幫助

-Daniel

回答

3

在我看來,你的代碼不使用array[0]可言。

在您上一次循環中,您可能需要更換ii-1,而不是i+1

此外,AFAIK,這不是搖牀也不冒泡排序: 你需要做的是一個主循環,裏面有兩個嵌套循環,一個從0到大小-1,另一個從大小-1到0 ,以及循環之間,測試是否必須交換,如果不是,那麼你的數組是排序的。

Take a look here for a clean implementation

+0

感謝您的回覆,我能夠使它工作。是的,這是一個搖牀/雞尾酒類。它的實現使用了嵌套for循環而不是do-while和一個布爾變量。 – Daniel 2012-02-10 04:28:08