虽然很简单,但也要踏踏实实一步一步的进行学习啊!
算法评价:
-
时间复杂度:平方阶。
-
空间复杂度:常量阶。
-
稳定性:稳定。
-
适用数据规模量:小规模。
算法复杂度与数据规模量关系图:
算法原理简述(小白可读):
冒泡排序的原理:若一个数组中共有n个元素,则一共会比较n-1轮,每一轮又会比较很多次。
第一轮,
第一次:第一个数和第二个数比较,比较换值后(如果前面那个数比后面那个数大的话,
需要互换值),保证大的数排后面,小的数排前面,第二次:第二个数和第三个数比较……
第三次:第三个数和第四个数比较……
……
第n-1次,第n-1个数和第n个数比较……
(第一轮结束后,就保证第n个数是这个数组中的最大的数。第一轮比较了n-1次)
第二轮,
第一次:第一个数和第二个数比较第二次:第二个数和第三个数比较……
……
第n-2次:第n-2个数和第n-1个数比较……
(第二轮结束后,就保证第n-1个数是这个数组中的第二大的数。第二轮比较了n-2次)
……
第n-1轮,
第一次: 第一个数和第二个数比较。第n-1轮结束后,就完成了这个数组的升序排列。第n-1轮比较了1次)
算法演示图:
Java对冒泡排序的实现(工具类):
import java.util.List;
/**
* 冒泡排序的Java实现
*
* @author JustryDeng
* @date 2019/4/25 18:56
*/
public class Bubble {
/**
* 冒泡排序的java实现
*
* 提示: 泛型Integer可换为任何一个 实现了Comparable<>接口的类
*
* 注: 这里没考虑元素本身为null的问题
*
* @param list
* 要被排序的对象集合
* @param asc
* 升序/降序。 true-升序; false-降序
*
* @return 排序后的集合(P.S:其实就算不返回任何值, 调用sort方法后,原list中的元素位置也会被排序)
* @date 2019/4/25 21:30
*/
public static List sort(List<Integer> list, boolean asc) {
if (list == null || list.size() <= 1) {
return list;
}
// 控制升序、降序
int leftAdd = asc ? 0 : 1;
int rightAdd = asc ? 1 : 0;
// 优化: 在进行了某轮循环后,发现所有的元素都已经是有序的了,那么就不需要再循环判断比较了;
boolean noNeedContinueSort;
int size = list.size();
int result;
Integer tmp;
for (int i = 0; i < size; i++) {
noNeedContinueSort = true;
for (int j = 0; j < size - i - 1; j++) {
/// 比较
// 假设A.compareTo(B)结果为res:若A > B,则res > 0;若A == B,则res == 0;若A < B,则res < 0
result = list.get(j + leftAdd).compareTo(list.get(j + rightAdd));
if (result <= 0) {
continue;
}
/// 互换
tmp = list.get(j + 1);
list.set(j + 1, list.get(j));
list.set(j, tmp);
noNeedContinueSort = false;
}
if (noNeedContinueSort) {
break;
}
}
return list;
}
}
测试一下:
控制台输出:
由此可见,冒泡排序工具类编写成功!