10大排序算法——01冒泡排序(Java實現)

冒泡排序(Bubble Sort)

冒泡排序也叫起泡排序

冒泡排序的執行流程

1.從頭開始比較每一對相鄰元素,如果第一個比第二個大,就交換他們的位置。(執行完第一輪,最後的那個元素就是最大的元素)

2.忽略從步驟1中找到的那個最大元素,然後重複執行步驟1,直到元素有序

來看代碼:

	public int[] bubbleSort(int[] array ){
		for (int end = array.length; end > 0; end--) {
			for (int begin = 1 ; begin<end ; begin++) {
				if(array[begin]<array[begin-1]) {
					int index = array[begin];
					array[begin]=array[begin-1];
					array[begin-1] = index;
				}
			}
		}
		return array;
	}

調用一下試試

	public static void main(String[] args) {
		BubbleSort b = new BubbleSort();
		int[] array = {9,8,7,4,5,6,1,2,3};
		System.out.println("排序前");
		for (int i = 0; i < array.length; i++) {
			if(i!=0) System.out.print(" ");
			System.out.print(array[i]);
		}
		
		b.bubbleSort(array);
		
		System.out.println("\n排序後");
		for (int i = 0; i < array.length; i++) {
			if(i!=0) System.out.print(" ");
			System.out.print(array[i]);
		}
	}
運行結果:
     排序前
     9 8 7 4 5 6 1 2 3
     排序後
     1 2 3 4 5 6 7 8 9

這是冒泡排序的最簡單的形式,下面我們來給他優化一下。

優化冒泡排序1

優化方案: 如果序列已經完全有序,可以提前終止排序

來看代碼:

	public int[] bubbleSort(int[] array ){
		for (int end = array.length; end > 0; end--) {
			
			boolean b = true;
			
			for (int begin = 1 ; begin<end ; begin++) {
				if(array[begin]<array[begin-1]) {
					
					int index = array[begin];
					array[begin]=array[begin-1];
					array[begin-1] = index;
					
					b = false;
				}
				if (b) break;
			}
		}
		return array;
	}

優化代碼和未優化的代碼的區別就是,優化代碼添加了一個boolean類型,用來判斷如果在for循環一圈後,都沒有觸動if語句,說明這個數組已經不需要排序了。然後直接結束排序。

當然這個排序還是可以有另外一種優化方式

優化冒泡排序2

優化方案: 如果序列已經局部有序,可以記錄最後一次交換的位置,減少交換次數。

來看代碼:

	public int[] bubbleSort(int[] array ){
		for (int end = array.length; end > 0; end--) {
			int j = 1;
			for (int begin = 1 ; begin<end ; begin++) {
				if(array[begin]<array[begin-1]) {
					int index = array[begin];
					array[begin]=array[begin-1];
					array[begin-1] = index;
					
					j = begin;
					
				}
				end = j;
			}
		}
		return array;
	}

優化代碼和未優化的代碼的區別就是,優化代碼添加了一個int類型,用來判記錄最後交換的位置,然後直接可以讓索引指向這個位置,下一次在進行循環可以直接從這個位置作爲應該索引,這個位置後面的元素就可以不去遍歷。

冒泡排序屬於穩定排序,爲原地算法

注:本文博主學習自騰訊課堂的小碼哥的“數據結構與算法”,所以如有和小碼哥課程中類似方案,純屬必然!!!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章