資料結構java版之氣泡排序及優化

zorro發表於2019-02-18

氣泡排序的時間用大O表示法是O(N^2).

傳統的氣泡排序:

/**
* @param total 要排序的陣列長度
*/
public void sort(int total){
int num[];
if(total <= 0){
System.out.println("請輸入大於0的正整數");
}else{
num = new int[total];
for (int i = 0 ; i < total; i++){
//生成隨機1到100之間的數
Random ra =new Random();
num[i] = ra.nextInt(100)+1;
}
System.out.println("要排序的陣列為:" + Arrays.toString(num));
int sum = 0;
int out,in;
for (out = total - 1; out > 1; out--){
for (in = 0 ; in < out; in++){
sum ++;
if(num[in] > num[in+1]){
int temp = num[in];
num[in] = num[in+1];
num[in+1] = temp;
}
}
}
// 最原始的氣泡排序
for(int i = 0; i < total -1 ; i ++){
for (int j = 0 ; j < total -1 ; j++){
sum ++;
if(num[j] > num[j+1]){
int temp = num[j];
num[j] = num[j+1];
num[j+1] = temp;
}
}
}
System.out.println("排序完成的陣列為:" + Arrays.toString(num));
System.out.println("總共用次數:" + sum);
}
}

優化過後的氣泡排序:

/**
* @param total 要排序的陣列長度
*/
public void sort(int total){
int num[];
if(total <= 0){
System.out.println("請輸入大於0的正整數");
}else{
num = new int[total];
for (int i = 0 ; i < total; i++){
//生成隨機1到100之間的數
Random ra =new Random();
num[i] = ra.nextInt(100)+1;
}
System.out.println("要排序的陣列為:" + Arrays.toString(num));
/**核心演算法:
* 雙重迴圈,外層迴圈用於控制排多少次序。
* 內層迴圈從第一位開始一直往後比較,內層迴圈一次後,可以將最大的數至於末尾。
* 外層迴圈讓內層迴圈繼續排沒有排序過的陣列,排序過的不用再排。
*/
int sum = 0;
int out,in;
for (out = total - 1; out > 1; out--){
for (in = 0 ; in < out; in++){
sum ++;
if(num[in] > num[in+1]){
int temp = num[in];
num[in] = num[in+1];
num[in+1] = temp;
}
}
}

System.out.println("排序完成的陣列為:" + Arrays.toString(num));
System.out.println("總共用次數:" + sum);
}
}

大家對比可以發現,就是外層迴圈的時候有點變化,其他的程式碼都是一模一樣的。

那麼優化後的演算法能快多少呢。我們都以陣列長度為10來計算:

傳統氣泡排序:9×9=81步,

優化後的氣泡排序:9+8+7+6+5+4+3+2=44步。

因為優化後的氣泡排序,每排完一次,最後一個數已經是最大的,就不需要再比較了。

相關文章