排序算法-冒泡排序-java

       只要咱們在作開發,算法對咱們來講,意義就很重大,雖然這個年代工具包/框架層出不窮,可以協助咱們作不少事情。可是業務上的邏輯,還得咱們本身去寫,到如今爲止,尚未什麼通用性極強的組件來幫助你實現你全部的業務。java

       特別是在處理一些複雜的業務時,擁有算法的積累,可以極大的給予你分析處理需求的能力,讓事務完成起來更加駕輕就熟,遊刃有餘。算法

       那今天咱們就來講冒泡排序,冒泡排序法是一種比較簡單的排序方式,理解起來也相對容易,數組

       它的實現是:
       1.將數組裏面前一個數據同後一個進行比較,若前面的數據大於/小於後面的數據,將二者進行調換;
       2.重複以上操做,在當次循環結束後,最大/最小的那個數始終在最後的位置;框架

下面直接上代碼:dom

1、排序類ide

/**
 * 冒泡排序
 * @author chengxp
 */
public class Bubble {

	/**
	 * 入口
	 * 
	 * @param arr
	 */
	public static void sortEntry(int[] arr) {

		// 外層循環遍歷當前數組
		for (int i = 0; i < arr.length; i++) {

			// 1.內層循環從下標0開始遍歷,遍歷長度每次減小1(由於每次循環完成後,當前最大值已經被移動到了最後一位,故最後一位不須要參與進循環)
			// 2.這裏爲何要多一個"-1"呢?請往下看:
			// 2.1.現有數組如:[74,28,88,21],長度爲4是吧;
			// 2.2.外層循環開始i = 0,內層循環次數(j < arr.length - 0)仍是4;
			// 2.3.當走到下標3的時候,arr[3+1],越界了,下標只有3;
			for (int j = 0; j < arr.length - 1 - i; j++) {

				// 比對下標相鄰的兩條數據,若前面的值大於後面的值,將數據進行交換
				if (arr[j] > arr[j + 1]) {

					// 知足條件,將數據進行調換
					DataProvider.changeEntry(arr, j, j + 1);
					System.out.println("changing:" + Arrays.toString(arr));
				}
			}
		}
	}

	public static void main(String[] args) {

		// 隨機獲取100之內數字羣
		int[] arr = DataProvider.getRandomArray(5);
		System.out.println("before:" + Arrays.toString(arr));
		Bubble.sortEntry(arr);
		System.out.println("after:" + Arrays.toString(arr));
	}
}

1、數據供給類工具

/**
 * 數據提供入口
 * @author chengxp
 *
 */
public class DataProvider {

	/**
	 * 建立指定長度的隨機數組
	 * @param length
	 */
	public static int[] getRandomArray(int length) {
		
		int[] arr = new int[length];
		DecimalFormat df = new DecimalFormat("#");
		
		for(int i = 0;i < length;i ++) {
			
			arr[i] = Integer.parseInt(df.format(Math.random() * 100));
		}
		return arr;
	}
	
	/**
	 * 交換入口
	 * @param arrTarget
	 * @param indexF
	 * @param indexS
	 */
	public static void changeEntry(int[] arrTarget,int indexF,int indexS) {
		
		int exchange = arrTarget[indexF];
		arrTarget[indexF] = arrTarget[indexS];
		arrTarget[indexS] = exchange;
	}
	
}

咱們運行一下Bubble類的代碼。code

隨機數組生成,並給出的排序 過程/結果 以下:orm

before:[36, 15, 9, 98, 19]排序

changing:[15, 36, 9, 98, 19]

changing:[15, 9, 36, 98, 19]

changing:[15, 9, 36, 19, 98]

changing:[9, 15, 36, 19, 98]

changing:[9, 15, 19, 36, 98]

after:[9, 15, 19, 36, 98]

如上,已經獲得了想要的結果。咱們來一塊兒仔細分析一下,這貨是怎麼完成的。
這是咱們的原數組:[36, 15, 9, 98, 19];
規則1:下標j>下標j+1,只要條件知足,咱們就交換;
規則2:每完成一次循環,下一次的循環長度-1,也就是(j < arr.length - 1 - i);

開始:
外層循環第一次循環,i = 0;內層j < arr.length - 1 - 0;j只會走到當前98的位置 j > j+1;
1.比較36>15,換:
changing:[15, 36, 9, 98, 19];
2.比較36>9,換:
changing:[15, 9, 36, 98, 19];
3.比較36>98,不換;
4.比較98>19,換:
changing:[15, 9, 36, 19, 98];
到這裏,已經找到了數組裏面最大的數。


外層循環第二次循環,i = 1;內層j < arr.length - 1 - 1;j只會走到當前36的位置,看見沒;
不會再找98了!!!由於當前循環體內,最大的j+1=下標3,98的位置是下標4。

1.15>9,換:
changing:[9, 15, 36, 19, 98];
2.15>36,不換;
3.36>19,換:
changing:[9, 15, 19, 36, 98];


外層循環第三次循環,i = 2;內層j < arr.length - 1 - 2;j只會走到當前15的位置;
1.9>15,不換;
2.15>19,不換;
依舊是:[9, 15, 19, 36, 98];


外層循環第四次循環,i = 3;內層j < arr.length - 1 - 3;j只會走到當前9的位置;
1.9>15,不換;


外層循環第五次循環,i = 4;內層j < arr.length - 1 - 4;退出內層循環;
退出外層循環;
結束...

修改DataProvider.getRandomArray(9)再來運行一次: before:[58, 90, 86, 17, 17, 61, 75, 27, 0] changing:[58, 86, 90, 17, 17, 61, 75, 27, 0] changing:[58, 86, 17, 90, 17, 61, 75, 27, 0] changing:[58, 86, 17, 17, 90, 61, 75, 27, 0] changing:[58, 86, 17, 17, 61, 90, 75, 27, 0] changing:[58, 86, 17, 17, 61, 75, 90, 27, 0] changing:[58, 86, 17, 17, 61, 75, 27, 90, 0] changing:[58, 86, 17, 17, 61, 75, 27, 0, 90] changing:[58, 17, 86, 17, 61, 75, 27, 0, 90] changing:[58, 17, 17, 86, 61, 75, 27, 0, 90] changing:[58, 17, 17, 61, 86, 75, 27, 0, 90] changing:[58, 17, 17, 61, 75, 86, 27, 0, 90] changing:[58, 17, 17, 61, 75, 27, 86, 0, 90] changing:[58, 17, 17, 61, 75, 27, 0, 86, 90] changing:[17, 58, 17, 61, 75, 27, 0, 86, 90] changing:[17, 17, 58, 61, 75, 27, 0, 86, 90] changing:[17, 17, 58, 61, 27, 75, 0, 86, 90] changing:[17, 17, 58, 61, 27, 0, 75, 86, 90] changing:[17, 17, 58, 27, 61, 0, 75, 86, 90] changing:[17, 17, 58, 27, 0, 61, 75, 86, 90] changing:[17, 17, 27, 58, 0, 61, 75, 86, 90] changing:[17, 17, 27, 0, 58, 61, 75, 86, 90] changing:[17, 17, 0, 27, 58, 61, 75, 86, 90] changing:[17, 0, 17, 27, 58, 61, 75, 86, 90] changing:[0, 17, 17, 27, 58, 61, 75, 86, 90] after:[0, 17, 17, 27, 58, 61, 75, 86, 90] 運行完畢,又完成了一次排序.

相關文章
相關標籤/搜索