排序演算法之氣泡排序

2021-08-30 08:35:45 字數 3561 閱讀 6320

氣泡排序是一種基於比較的簡單的演算法,這種演算法越大的元素會越來越靠近數列的頂端,就像汽水裡面的氣泡一樣往上冒,因此得名為氣泡排序。

首先遍歷陣列,比較相鄰兩個元素的大小,如果第乙個元素比第二個元素要大則交換兩個元素的位置,這樣遍歷完一輪後最大的元素就到了末尾。重複上面的步驟,只不過因為上一輪遍歷後上一輪中最大的元素已經到了末尾,所以不需要比較該元素,即每一次遍歷的長度減 1,直到遍歷長度為 1 為止。

假如有乙個這樣的陣列:,根據上面的思想,它氣泡排序的過程是這樣的:

}system.out.println("第" + (i + 1) + "次比較後" + "origin--->" + arrays.tostring(origin));

}system.out.println("index--->" + index);

system.out.println("sortedarray--->" + arrays.tostring(origin));

return origin;

}使用測試**執行一遍:

@test

public void testbubblesort1()

int intarray = new int ;

bubblesort1(intarray);

}

執行結果如下:

從上面的列印中我們可以看出,在第 3 次比較完成後陣列其實已經是有序的了,但是後面還進行了 6 次比較,這顯然是多餘的,所有這些多餘的比較我們是可以優化掉一大部分的。在內迴圈開始前設定乙個標誌位,如果內迴圈中有元素的交換,則改變標誌位的值,那麼如果內迴圈遍歷完標誌位都沒有改變,則說明已經排序完成,跳出迴圈,避免掉後面多餘的比較。當然,在上面的示例中雖然從第 4 次到第 9 次都是多餘的,但是我們得依靠第 4 次的迴圈來判斷是否已經排序完成,所以第 4 次比較是省略不掉的,只能省略第 5 次到第 9 次。

**如下:

public static int bubblesort2(int origin) ;

}system.out.println("origin--->" + arrays.tostring(origin));

int index = 0;

for (int i = 0; i < origin.length - 1; i++)

index++;

}system.out.println(

"第" + (i + 1) + "次比較後" + "origin--->" + arrays.tostring(origin) + ",issorted--->" + issorted);

//如果內迴圈結束後標誌位仍為 true,則說明已經排序完成,則可以跳出外迴圈,省略後面多餘的比較

if (issorted)

}system.out.println("index--->" + index);

system.out.println("sortedarray--->" + arrays.tostring(origin));

return origin;

}

列印結果如下,可以看到只有前面 4 次迴圈,也就是比較 9+8+7+6=30 次。

同樣從上面的列印中我們可以看到,在第 1 次比較後,後面的 4、5、6、7、8、9 就已經是有序的了,後面再來比較這後面的部分它還是不會改變元素的位置,所以第 2 次比較的時候,元素 4,也就是下標為 4 的元素及後面的元素就沒有比較的必要了,我們可以記錄一下上次比較到**(如記錄為下標 n)就停止了,也就是從 n 開始後面的元素就已經是有序的了,下次內迴圈就到這裡就可以了,不用再比較後面的元素。

所以我們需要修改一下內迴圈的部分:

public static int bubblesort(int origin) ;

}system.out.println("origin--->" + arrays.tostring(origin));

// 記錄最後一次交換的位置

int lastexchangeindex = 0;

// 無序數列的邊界,每次比較只需要比到這裡為止

int sortborder = origin.length - 1;

int index = 0;

for (int i = 0; i < origin.length - 1; i++)

index++;

}system.out.println("第" + (i + 1) + "次比較後" + "origin--->" + arrays.tostring(origin) + ",issorted--->"

+ issorted + ",sortborder--->" + sortborder + ",lastexchangeindex--->" + lastexchangeindex + ",index--->" + index);

sortborder = lastexchangeindex;

if (issorted)

}system.out.println("index--->" + index);

system.out.println("sortedarray--->" + arrays.tostring(origin));

return origin;

}

執行結果如下:

可以看到同乙個陣列,在氣泡排序經過優化後,比較次數減少至三分之一,當然這只是個例不能說明全部,但是這說明優化是很有必要的。

假設原始陣列長度為 n,則外迴圈 n 次,每次遍歷巢狀乙個內迴圈,所以時間複雜度為 o(n²)。

氣泡排序只用到迴圈,臨時變數所佔空間不隨原始陣列的長度改變而改變,所以空間複雜度為 o(1)。

1.氣泡排序適用於小數和整數,實現簡單,空間複雜度低,並且屬於穩定排序。

1.氣泡排序效率並不高,每次只能移動相鄰兩個資料,時間複雜度最高達到 o(n²)。

排序演算法之氣泡排序

參考 氣泡排序演算法的運作如下 比較相鄰的元素。如果第乙個比第二個大,就交換他們兩個。對每一對相鄰元素作同樣的工作,從開始第一對到結尾的最後一對。在這一點,最後的元素應該會是最大的數。針對所有的元素重複以上的步驟,除了最後乙個。持續每次對越來越少的元素重複上面的步驟,直到沒有任何一對數字需要比較。若...

排序演算法之氣泡排序

對於大多數學計算機的人來說,氣泡排序應該都是接觸的第一種排序方式,氣泡排序的排序思想是比較簡單的,它的演算法的是 比較相鄰的元素。如果第乙個比第二個大,就交換他們兩個。對每一對相鄰元素作同樣的工作,從開始第一對到結尾的最後一對。在這一點,最後的元素應該會是最大的數。針對所有的元素重複以上的步驟,除了...

排序演算法之氣泡排序

氣泡排序 bubble sort 是一種電腦科學領域的較簡單的排序演算法。它重複地走訪過要排序的數列,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來。走訪數列的工作是重複地進行直到沒有再需要交換,也就是說該數列已經排序完成。這個演算法的名字由來是因為越大的元素會經由交換慢慢 浮 到數列的頂端,...