只要咱們在作開發,算法對咱們來講,意義就很重大,雖然這個年代工具包/框架層出不窮,可以協助咱們作不少事情。可是業務上的邏輯,還得咱們本身去寫,到如今爲止,尚未什麼通用性極強的組件來幫助你實現你全部的業務。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] 運行完畢,又完成了一次排序.