冒泡排序
冒泡排序是一种基于比较的排序算法,每次冒泡操作都会比较相邻的两个数,检查是否满足大小关系,如果不满足就互换。一次冒泡操作至少让一个元素移动到家排序后所在的位置。重复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)
原地排序算法
|
是
(在相等情况下不做交换)
|