冒泡排序的思路:
比較相鄰的兩個數,如果順序和指定的順序相反那麼就交換位子,每比較完一趟需要比較的個數-1:
eg:
比較的趟數最多爲n-1趟,最少爲一趟(即數組的順序和默認要求的排列順序一致)。
下面我們來根據冒牌排序的趟數來分析代碼:
1)、每趟的比較次數都大於1次
@Test
public void bubble(){
int a[]={12,34,23,21,43,12,34,45,65};
for(int i=0;i<a.length-1;i++){//比較的趟數
for(int j=j;j<a.length-i-1;j++){
if(a[j]>a[j+1]){
swap(a,j,j+1);
}
}
}
print(a);//自己寫的輸出數組的函數
}
其中swap是一個交換引用的函數,關於值的交換值得注意的是:基本數據類型的交換是值的交換,而數組需要的是引用的交換。不可以採用基本數據類型的值交換方式來交換數組的值。
public void swap(int a[], int i, int j) {
int temp = a[i];
a[i] = a[j];
a[j] = temp;
}
2)、優化:假設存在有一行的比較次數爲0,那麼就等價於這一趟之前已經完成排序,即可退出排序循環。 用一個boolean值來進行判斷,如果沒有進行交換就退出循環。
public void bubbleSort2(int a[]) {
for (int i = 0; i < a.length; i++) {
boolean boo = true;
for (int j = 0; j < a.length - i - 1; j++) {
if (a[j] > a[j + 1]) {
swap(a, j, j + 1);
boo = false;
}
}
if (boo)
break;
}
print(a);}