只要咱们在作开发,算法对咱们来讲,意义就很重大,虽然这个年代工具包/框架层出不穷,可以协助咱们作不少事情。可是业务上的逻辑,还得咱们本身去写,到如今为止,尚未什么通用性极强的组件来帮助你实现你全部的业务。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] 运行完毕,又完成了一次排序.