java氣泡排序的實現以及優化
阿新 • • 發佈:2018-12-20
氣泡排序原理:
1、比較相鄰的兩個元素,如果前者大於後者則交換位置;
2、這樣對陣列第0個數據到N-1個數據進行遍歷比較一次後,最大的資料會移動到最後一位。
3、N=N-1,如果N=0則排序完成;
程式碼實現
package zks; public class BubbleSort { public static void Bubble(int a[],int n){ int i,j; for(i = 0;i < n;i++){//N次排序 for(j = 1;j < n - i;j++){//每迴圈一次取出最大值放在陣列的n-i位; if(a[j - 1] > a[j]){//相鄰元素比較 int temp; temp = a[j]; a[j] = a[ j- 1]; a[j - 1] = temp;//替換元素 } } } } }
package zks;
public class Main {
public static void main(String args[]){
int[] arr = {1,1,2,0,9,33,21,7,13,3,35,65,22};
BubbleSort.Bubble(arr, arr.length);
for(int i = 0;i<arr.length;i++){
System.out.print(arr[i]+",");
}
}
}
輸出結果如下:
上面這個是最基本的氣泡排序方法,如果說陣列數量比較大並且有一部分是本來就有序的,那麼將會在此部分浪費時間。所有考慮到這種情況,可以事先設定一個標識flag,如果此次循化下來發生了交換,則為true,否則說明排序已完成,為false。
程式碼如下:
package zks; public class BubbleSort { public static void Bubble2(int a[],int n){ int j, k = n; boolean flag = true;//發生了交換就為true, 沒發生就為false while (flag){ flag=false;//每次開始排序前,都設定flag為未排序過 for(j=1; j<k; j++){ if(a[j-1] > a[j]){ int temp; temp = a[j-1]; a[j-1] = a[j]; a[j]=temp; //表示交換過資料; flag = true; } } k--;//減小一次排序的尾邊界 } } }
結果如下:
在此優化的基礎上考慮到,如果有一個包含500個數值的陣列,前100個是無序的,後400個全部是有序排列好的並且後面的400個數值的最低值都大於前100個的最高值。如果用第二種方法的話,雖然也是隻會比較100次,但是每一次都會與後面400位相比較,而用下面的方法只需要與後面400位比較一次,便會記錄下這個標識然後設定尾邊界,以後的99次便不會與後面400相比較
再次優化後代碼如下:
package zks;
public class BubbleSort {
public static void Bubble3(int [] a, int n){
int j , k;
int flag = n ;//flag來記錄最後交換的位置,也就是排序的尾邊界
while (flag > 0){//flag>0的話說明排序未結束
k = flag; //k 來記錄遍歷的尾邊界
flag = 0;
for(j=1; j<k; j++){
if(a[j-1] > a[j]){//前面的數字大於後面的數字就交換
//交換a[j-1]和a[j]
int temp;
temp = a[j-1];
a[j-1] = a[j];
a[j]=temp;
//表示交換過資料;
flag = j;//記錄最新的尾邊界.
}
}
}
}
}
結果如下:
此方法相比之前的兩種相對更友好一些;