冒泡排序
冒泡排序是一种基于比较的排序算法,每次冒泡操作都会比较相邻的两个数,检查是否满足大小关系,如果不满足就互换。一次冒泡操作至少让一个元素移动到家排序后所在的位置。重复n次就完成了排序。
还是图比较直观,以5、3、8、2、7、1数据为例,来画个图。
我的冒泡实现
这是我最原始的实现,冒泡排序
这样过程进行6次就完成了冒泡的排序
这是我实现的冒泡排序的代码:
public void sort(Integer[] data) {
if (data == null || data.length <= 1) { return; }
for (int i = 0; i < data.length; i++) { boolean breakFlag = false; // 进行冒泡操作, for (int j = 0; j < data.length; j++) { //进行当前的元素每一项比较 if (data[i] < data[j]) { Integer item = data[i]; data[i] = data[j]; data[j] = item; breakFlag = true; } }
System.out.println("当前前第:" + i + "次:" + Arrays.toString(data));
// 当一次冒泡没有数据进行交换,说明排序已经完成 if (!breakFlag) { break; } } } |
我的冒泡还有很大的改进空间,再来一个标准的冒泡排序的实现
老师的标准的冒泡排序:
这是老师的标准的冒泡排序算法的一次冒泡操作
再来看看完整的一个冒泡的过程:
标准的冒泡排序的算法的实现:
public class BubbleSort<T> implements SortInf<T> {
@Override public void sort(T[] data) { if (null == data || data.length <= 1) { return; }
int dataLength = data.length;
for (int i = 0; i < dataLength; i++) { boolean brakFlag = false; // 一次冒泡操作,至少一个元素放置到了排序之后所在的位置,比较交换的次数也会越来越少 for (int j = 0; j < dataLength - i - 1; j++) { // 过行数据中的两两比较,(x < y) ? -1 : ((x == y) ? 0 : 1); // 在数值的比较中,如果左边的数比右边的数小,则返回-1, if (((Comparable) data[j]).compareTo(data[j + 1]) > 0) { T dataTmp = data[j]; data[j] = data[j + 1]; data[j + 1] = dataTmp; brakFlag = true; } } System.out.println("当前第:" + i + "次:" + Arrays.toString(data)); // 如果一次交换则不存在数据交换时,则说明数据已经冒泡完成,无需再冒泡操作 if (!brakFlag) { break; } } } } |
冒泡排序总结
算法名称 | 最好情况时间复杂度 | 最好情况的原始数据 | 最坏情况时间复杂度 | 最坏情况的原始数据 | 平均情况时间复杂度 | 是否基于比较 | 空间复杂度 | 是否稳定排序算法 |
冒泡排序 | O(N) | 原始数据已经是有序,元需交换 | O( ) | 原始数据倒序排列 | O( ) | 是 | O(1) 原地排序算法 | 是 (在相等情况下不做交换) |