一、什么是冒泡排序
1.1、文字描述
冒泡排序是一种简单的排序算法。它重复地走访要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,这也就说明排序已经完成。因为越大的元素会经由交换慢慢‘浮‘到数列的顶端,所以命名为冒泡算法排序。
1.2、程序描述
定义一个变量 i = 0,最大值为数列的长度 - 1 , i 与 i + 1 进行比较,如果 i > i + 1 则进行交换。随着 i 的不断增加,直到 i 达到数列长度 - 1。
附动态图:
二、简单的代码展示
我们先进行最基础的操作,再依次进行比对。
PS: 这样会产生一些无效的操作,后面我们再进行优化...
public static void main(String[] args) {
int handleTimes = 0;
/* 定义一个简单的乱序数组 */
int[] intArr = {2,4,1,5,6,3,7};
for (int i = 0;i < intArr.length; i++) {
/* 开启双重循环 */
for (int j = 0; j < intArr.length - i - 1; j++) {
/* 拿到当前操作的数据和下一个进行比较 */
if (intArr[j] > intArr[j + 1]) {
/* 我们按照从小到大排序,如果当前的大于下一个数据则两个数据互换 */
int temp = intArr[j];
intArr[j] = intArr[j+1];
intArr[j+1] = temp;
}
}
System.out.println("第" + handleTimes + "次排序" + CollectionUtils.arrayToList(intArr));
handleTimes++;
}
System.out.println(handleTimes);
System.out.println(CollectionUtils.arrayToList(intArr));
}
输出如下:
三、代码优化
通过上面的代码我们可以看到一共进行了7次排序,但是从第四次开始已经是完成了的,后面的都是无效操作。所以我们对代码进行了如下优化:
① 定义一个排序生效字段 isChanged,当排序进行时我们使其修改为true
② 每次大循环时我们都初始isChengerd为false,当每次大循环结束时,如果isChanged还是false,则进行已经没有进行排序了
public static void main(String[] args) {
int handleTimes = 0;
boolean isChangerd = false;
/* 定义一个简单的乱序数组 */
int[] intArr = {2,4,1,5,6,3,7};
for (int i = 0;i < intArr.length; i++) {
isChangerd = false;
/* 开启双重循环 */
for (int j = 0; j < intArr.length - i - 1; j++) {
/* 拿到当前操作的数据和下一个进行比较 */
if (intArr[j] > intArr[j + 1]) {
/* 我们按照从小到大排序,如果当前的大于下一个数据则两个数据互换 */
int temp = intArr[j];
intArr[j] = intArr[j+1];
intArr[j+1] = temp;
/* 这里定义一个中间变量进行操作 */
isChangerd = true;
}
}
System.out.println("第" + handleTimes + "次排序" + CollectionUtils.arrayToList(intArr));
/* 如果这里如果上面的操作没有交换则说明排序已经完成 */
if (!isChangerd) {
break;
}
handleTimes++;
}
System.out.println(CollectionUtils.arrayToList(intArr));
}
输出如下: