学习笔记--数据结构与算法--冒泡排序

冒泡排序

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

原地排序算法

(在相等情况下不做交换)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值