1. 程式人生 > >java氣泡排序的實現以及優化

java氣泡排序的實現以及優化

氣泡排序原理:

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;//記錄最新的尾邊界.
	            }
	        }
	    }
	}
}

結果如下:


此方法相比之前的兩種相對更友好一些;