八大排序-冒泡排序

概要

冒泡排序算法的名字由來是由於越大的元素會經由交換慢慢「浮」到數列的頂端(升序或降序排列),就如同碳酸飲料中二氧化碳的氣泡最終會上浮到頂端同樣,故名「冒泡排序」。冒泡排序是八大排序中的入門級排序算法,也是算法入門中比較經典的排序算法。本篇系統介紹下冒泡排序的原理以及實現。java

原理

循環對比數組中先後相鄰的兩個元素,將較大的數交換移動到後面,一趟排序以後最大的數會被移動到最末尾。而後排除最末尾最大數,繼續循環將最大數移動到末尾,最終保證數組有序。算法

一趟排序

以數組int n[] = { 6, 5, 2, 7, 1 }爲例: 數組

  • 第一次6和5對比,較大的數字6與5交換;
  • 第二次6和2對比,較大的數字6繼續與2交換;
  • 第三次6和7對比,較大的數字7無需交換;
  • 第四次7和1對比,較大的數字7和1交換;

一趟排序後數組中最大的數字7位於數組末位bash

多趟排序控制

一趟排序後最大數字位與末位,經過控制數組下標大小,每次循環將須要排序數組個數減少一個,從而使得一趟排序後剔除當前最大元素後,繼續對比交換依次將最大數字移動至末位: 優化

  • 第一趟排序將最大數字7移動至末位;
  • 第二趟排序將7以前最大數字6移動至倒數第2位;
  • 第三趟排序將6以前最大數字5移動至倒數第3位;
  • 第四趟排序將5以前最大數字2移動至倒數第4位(第2位);

編碼實踐

public class Test {

	public static void main(String[] args) {
		int n1[] = { 6, 5, 2, 7, 1 };
		bubbleSort1(n1);
		System.out.print("冒泡排序方法一結果:");
		for (int m : n1) {
			System.out.print(m + " ");
		}
		System.out.println("");
		int n2[] = { 6, 5, 2, 7, 1 };
		bubbleSort1(n2);
		System.out.print("冒泡排序方法二結果:");
		for (int m : n2) {
			System.out.print(m + " ");
		}
		System.out.println("");
		int n3[] = { 6, 5, 2, 7, 1 };
		bubbleSort1(n3);
		System.out.print("冒泡排序方法三結果:");
		for (int m : n3) {
			System.out.print(m + " ");
		}
	}

	public static void bubbleSort1(int n[]) {
		for (int i = n.length - 1; i >= 0; i--) {
			for (int j = 0; j < i; j++) {
				if (n[j] > n[j + 1]) {
					int temp = n[j];
					n[j] = n[j + 1];
					n[j + 1] = temp;
				}
			}
		}
	}

	public static void bubbleSort2(int n[]) {
		for (int i = n.length - 1; i >= 0; i--) {
			for (int j = 0; j < i; j++) {
				if (n[j] > n[j + 1]) {
					n[j] ^= n[j + 1];
					n[j + 1] ^= n[j];
					n[j] ^= n[j + 1];
				}
			}
		}
	}

	public static void bubbleSort3(int n[]) {
		boolean isSort = false;
		for (int i = n.length - 1; i >= 0 && !isSort; i--) {
			isSort = true;
			for (int j = 0; j < i; j++) {
				if (n[j] > n[j + 1]) {
					n[j] ^= n[j + 1];
					n[j + 1] ^= n[j];
					n[j] ^= n[j + 1];
					isSort = false;
				}
			}
		}
	}
}
複製代碼
  • 結果
冒泡排序方法一結果:1 2 5 6 7 
冒泡排序方法二結果:1 2 5 6 7 
冒泡排序方法三結果:1 2 5 6 7 
複製代碼

說明

上述三種冒泡排序的編碼實踐方法中,第一種是冒泡排序最基礎的寫法;第二種使用位運算優化交換數字的效率;第三方法,利用標記位斷定數組是否已經有序從而避免對有序數組的遍歷進一步優化效率。編碼

彩蛋

方法二bubbleSort2中交換數字使用的位運算:spa

n[j] ^= n[j + 1];
n[j + 1] ^= n[j];
n[j] ^= n[j + 1];
複製代碼

交換的原理是?這即是本篇的彩蛋。code

結語

冒泡排序是最簡單的排序算法之一,本篇重點介紹冒泡排序算法思想原理以及實現。進一步又介紹了冒泡的優化小技巧,理解本篇後相信往後再碰見手寫冒泡排序的場景會更加駕輕就熟,學無止境。最後,若是以爲本篇對你有所啓發或幫助,不妨關注走一波0.0cdn

Alt

關注訂閱號 獲取更多幹貨~
相關文章
相關標籤/搜索