2015-02-06 77 views
0

我測量排序完成排序所需的步驟數,無論出於何種原因,氣泡排序總是比插入排序快一點,從我讀的內容來看,它應該是相反的方式。Java - 爲什麼我的Bubble排序比我的插入排序更快?

不會發布我的完整代碼,但我相信這個問題可能與我有我的位置有關。

冒泡排序:

public void sort() 
{ 
    for (out = nElems-1 ; out >= 1 ; out--) 
    { 
     count = count+1; 
     for (in = 0 ; in < out ; in++) 
     { 
      if ((a.get(in)) > (a.get(in+1))) 
      { 
       swap (in, in+1); 
       count = count+2; 
      } 
     } 
    } 
} 

插入排序:

void sort() 
{ 
    Integer temp[] = new Integer[1]; 
    for (out = 1 ; out < nElems ; out++) 
    { 
     count = count+1; 
     temp[0] = a.get(out); 
     in = out; 
     while (in > 0 && a.get(in-1) >= temp[0]) 
     { 
      a.set(in, a.get(in-1)); 
      --in; 
      count = count+2; 
     } 
     a.set(in, temp[0]); 
    } 
} 

,只是舉個例子,我整理充滿了2000的隨機整數3個文本文件的值,從1- 2000年,插入排序的平均值爲2,007,677步,而冒泡排序的平均值爲2,005,719。

+0

你如何計算步驟?你不應該計算正在進行的比較次數嗎?或者可能訪問數組的數量(讀或寫)? – Thilo 2015-02-06 00:14:34

+0

是的,你在氣泡排序中缺少比較(最裏面的if,內部循環延續條件)。這只是兩件事,我甚至沒有看過插入排序。 – lared 2015-02-06 00:16:26

+0

如果您有交換的count = count + 2,您是否應該爲單向傳輸計數= count + 1? – Joffan 2015-02-06 00:17:11

回答

1

所以,首先,你只測量作業,而不是整體表現。其次,你的插入排序有優化不交換移動的價值,所以你爲什麼每次添加2到count?你的while循環應該只加1到count,然後當你有a.set(in,temp[0])時,你應該在while循環之外再加1。 (注意 - 爲什麼temp是一個數組而不僅僅是一個整數?) 現在,如果要測量整體性能,則需要測量比較和分配(最好在兩個單獨的變量中,因爲某些設備/體系結構可能會有這些操作的性能不同)。

編輯:

爲了澄清,比較是當你從陣列與操作者比較的兩個項目的值等比小於(<)或大於(>)。分配是當您更改數組中的值時(在您的情況下,使用a.set())。

下面是一些代碼的修改(我分裂count成兩個變量代表實際的東西,你會想衡量,assignmentscomparisons):

冒泡排序:

public void sort() 
{ 
    for (out = nElems-1 ; out >= 1 ; out--) 
    { 
     for (in = 0 ; in < out ; in++) 
     { 
      comparisons = comparisons+1; 
      if ((a.get(in)) > (a.get(in+1))) 
      { 
       swap (in, in+1); 
       assignments = assignments+2; 
      } 
     } 
    } 
} 

插入排序:

void sort() 
{ 
    int temp = 0; 
    for (out = 1 ; out < nElems ; out++) 
    { 
     count = count+1; 
     temp[0] = a.get(out); 
     in = out; 
     comparisons = comparisons + 1; //You're doing the comparison below at least once 
     while (in > 0 && a.get(in-1) >= temp[0]) 
     { 
      a.set(in, a.get(in-1)); 
      --in; 
      assignments = assignments+1; 
      comparisons = comparisons + 1; 
     } 
     a.set(in, temp[0]); 
     assignments = assignments+1; 
    } 
} 

要考慮的另一件事 - 你在哪裏初始化變量count?我在代碼中沒有看到它,實際上可能是因爲您使用的是不同範圍內的同一個變量,並且由於您沒有將其重置爲0,所以無論您選擇哪種第二種方法都將其添加到你的第一個號碼。

+0

每次添加2次,因爲它是正確的最佳/最差案例場景(相信我,我試着用+1開始)。最好的情況是2000年,最糟糕的是2000年^ 2。我已將+1添加到我的while循環外部。至於溫度作爲一個陣列,這是我的教授的選擇,所以我只是決定效仿這個例子。 – Link2999 2015-02-06 00:35:32

+0

那麼,如果您不進行優化移位,然後在找到合適的位置後插入值,那麼加2就是正確的 - 也許您的樣本最好/最差的情況是沒有這種優化? – childofsoong 2015-02-06 00:38:18

+0

而不是編輯,因爲我看到你在做一些工作。我正在與bigO合作,所以我對我是應該測量任務,比較還是兩者都有點困惑(我假設都是這樣)。我知道在我的情況下,如果我有一個2000到2000的整數的文件,那麼排序和已經排序的文件在兩種情況下都會得到2000的結果,在最壞的情況下結果爲2000^2。你的修改似乎給了我一些奇怪的結果。 – Link2999 2015-02-06 00:49:11

相關問題