2016-05-11 81 views
3

第一:哪一個是冒泡排序?

for(int i=0;i<n-1;i++) 
    for(int j=n-1; j>i;j--) 
    if(a[j] < a[j-1]) 
     swap(a[j], a[j-1]); 

或第二:

for(int i=0; i<n-1; i++) 
    for(int j=i+1; j<n; j++) 
    if(a[j] < a[i]) 
     swap(a[j],a[i]); 

或第三個版本:

int temp, i, j = 0; 
    boolean swaped = true; 

    while (swaped) { 
     swaped = false; 
     j++; 
     for(i = 0; i < arr.length - j; i++){ 
      if(arr[i] > arr[i+1]){ 
       temp = arr[i]; 
       arr[i] = arr[i+1]; 
       arr[i+1] = temp; 
       swaped = true; 
      } 
     } 
    } 

有人說,第一,有人說第二。那麼哪一個是對的?有人說第二個是交換排序。許多書說泡沫排序是第三個版本,但許多人稱第一個版本是泡沫排序。任何意見?

+0

第三個版本 - 有點奇怪。它甚至排序? –

+0

@MichaelDorgan:這是一個泡沫排序的常見優化 –

+0

猜測我很久以前就停止使用它:)我想知道爲什麼? –

回答

1

我在IntelliJ中使用Java測試了兩個代碼片段的實際數組。兩個版本都按升序排序生成數組。

這裏是我使用的陣列:

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

這裏是從兩個版本的輸出:

版本1

[1, 2, 3, 4, 5, 6, 7, 8, 9] 

2版

[1, 2, 3, 4, 5, 6, 7, 8, 9] 

第一個版本看起來像一個標準的氣泡排序,而第二個版本看起來像是別的東西。

+0

我得到正確的輸出爲第二個版本:http://ideone.com/Nn2uT6 – fgb

6

第一個版本是氣泡排序,因爲它是比較每一對相鄰的項目。

第二個版本是選擇排序,因爲a[i]最終成爲外循環的每次迭代後數組未排序右側部分中的最小項。

+0

你確定這些是選擇排序嗎?我認爲選擇排序通過數組的未排序部分,找到最小的元素並將其移動到未排序部分的開始處,然後將未排序部分的大小減小一。 –

+0

@JonathanLeffler這不完全相同。狀態與每個外迭代的選擇排序相同,但有一些額外的冗餘交換。它仍然在尋找最小的元素,但它將交換最小的多次,而不是最後一次。我認爲這可能是一些氣泡排序變體,但我認爲冒泡排序需要交換相鄰的元素。 – fgb

+0

有一個「我不太清楚爲什麼我會困擾」的元素(因爲它們都很慢並且不是特別有用),但是也有一個「我希望它是正確的」元素。您會在主要問題的評論中看到,我認爲第一個是插入排序,第二個是泡泡排序,第三個是修改後的泡泡排序。我仍然認爲沒有一種是選擇性的;請參閱我對該問題的評論中引用的維基百科文章。 (我在第一個評論中也錯了 - 我沒有在這裏聲稱完美!) –