数据结构之--冒泡排序

5 篇文章 0 订阅
5 篇文章 0 订阅

        冒泡排序只会操作相邻的两个数据。每次冒泡操作都会对相邻的两个元素进行比较,看是否满足大小关系要求。如果不满足就让它俩互换。一次冒泡会让至少一个元素移动到它应该在的位置,重复 n 次,就完成了 n 个数据的排序工作。

但是正常的冒泡排序还可以优化,当某次冒泡操作已经没有可交换的数据时,说明已经完全达到有序了,不用再继续执行后续的冒泡,此时给他一个标签,当当前数据没有发生交换时,退出当前操作。

代码示例:

 

 public static void main(String[] args) {
    MaoPao mp = new MaoPao();
    Random ran = new Random();
    Set<Integer> set = new HashSet<Integer>();
    while(set.size()==100000?false:true){
        int num = ran.nextInt(1000000)+1;
        set.add(num);
    }
    Integer[] a = new Integer[set.size()];
    set.toArray(a);
    long l = System.currentTimeMillis();

    mp.bubbleSort(a,a.length);
    System.out.println("冒泡排序后:"+ Arrays.toString(a));
    
    long l1 = System.currentTimeMillis();
    System.out.println(l1-l);
}

// 冒泡排序,a 表示数组,n 表示数组大小
public void bubbleSort(Integer[] a, int n) {
    if (n <= 1){
        return;
    }

    for (int i = 0; i < n; ++i) {
        // 提前退出冒泡循环的标志位
        boolean flag = false;
        for (int j = 0; j < n - i - 1; ++j) {
            if (a[j] > a[j+1]) { // 交换
                int tmp = a[j];
                a[j] = a[j+1];
                a[j+1] = tmp;
                flag = true;  // 表示有数据交换
            }
        }
        if (!flag){// 没有数据交换,提前退出
            break;
        }
    }
}

冒泡排序过程只涉及相邻的数据交换操作,所以他的谁空间复杂度为O(1),是一个原地排序算法。

而且为了保证冒泡排序的算法稳定性,当有相邻的两个元素大小相等时,我们不交换数据,相同大小的数据在排序前后不会改变顺序,所以冒泡排序算是稳定排序算大。

冒泡排序最好的情况时间复杂度是O(n),而最坏的情况是,排序的数据刚好都是倒叙排列的,我们需要进行n西冒泡操作,所以最坏情况时间复杂度为O(n2)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值