一、算法實現(xiàn)
- 基本實現(xiàn)
/**
* 冒泡排序(交換排序)
*/
public static int[] sortBubble(int[] arr) {
int i, j, temp;
for (i = 0; i < arr.length - 1; i++) {
for (j = 0; j < arr.length - 1 - i; j++) {
if (arr[j] > arr[j + 1]) {
temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
return arr;
}
- 算法改進
設(shè)置標志變量:標志變量用于記錄每趟冒泡排序是否發(fā)生數(shù)據(jù)元素位置交換。如果沒有發(fā)生交換,說明序列已經(jīng)有序了,不必繼續(xù)進行下去了。
/**
* 設(shè)置標志變量
*/
public static int[] sortBubble(int[] arr) {
int i, j, temp, change = 1;
for (i = 0; i < arr.length - 1 && change != 0; i++) {
change = 0;
for (j = 0; j < arr.length - 1 - i; j++) {
if (arr[j] > arr[j + 1]) {
temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
change = 1;
}
}
}
return arr;
}
二、運行示例
{20, 15, 10, 12}
【15, 20】, 10, 12 //--> [0]與[1]比較,大的放后面
15, 【10, 20】, 12 //--> [1]與[2]比較,大的放后面
15, 10, 【12, 20】 //--> [2]與[3]比較,大的放后面
(第一個內(nèi)循環(huán)后最大的數(shù)在最后的位置)
【10, 15】, 12, 20 //--> [0]與[1]比較,大的放后面
10, 【12, 15】, 20 //--> [1]與[2]比較,大的放后面
(第二個內(nèi)循環(huán)后第二大的數(shù)在倒數(shù)第二的位置)
三、性能分析
- 時間復雜度
在設(shè)置標志變量之后:
1.當原始序列“正序”排列時,冒泡排序總的比較次數(shù)為n-1,移動次數(shù)為0,也就是說冒泡排序在最好情況下的時間復雜度為O(n)
2.當原始序列“逆序”排序時,冒泡排序總的比較次數(shù)為n(n-1)/2,移動次數(shù)為3n(n-1)/2次,所以冒泡排序在最壞情況下的時間復雜度為O(n^2)
3.當原始序列雜亂無序時,冒泡排序的平均時間復雜度為O(n^2)
- 空間復雜度
冒泡排序排序過程中需要一個臨時變量進行兩兩交換,所需要的額外空間為1,因此空間復雜度為O(1)。
- 穩(wěn)定性
冒泡排序在排序過程中,元素兩兩交換時,相同元素的前后順序并沒有改變,所以冒泡排序是一種穩(wěn)定排序算法。