冒泡排序及其优化用Java代码实现

本文深入讲解了冒泡排序的基本思想,通过生动的比喻帮助理解其工作原理,并提供了两种不同的Java代码实现方式,一种是最基本的冒泡排序方法,另一种是对基本方法进行了优化,避免了对已有序数字的重复比较,从而提高了效率。此外,还分析了冒泡排序的时间复杂度、空间复杂度以及稳定性等特性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一,基本思想
顾名思义,冒泡排序就像水中的气泡一样,气泡一层一层向上走,越靠近水面的气泡越大。
简单来说,冒泡排序就是从需要排序的n个数字元素的第一个数字开始,对数字进行两两比较,将两者中较大的数字向后移动。经过第一趟排序,共比较n-1次,整个数字元素中最大的数字将在整串数字末尾;经过第二趟排序,比较n-2次,第二大数字就会排在倒数第二位…

图片说明:
在这里插入图片描述
二,代码实现

   public class TestDemo {
    public static int[] Sort(int[] array){
        //外层循环控制比较的趟数
        for (int i = 0; i < array.length-1; i++) {
            //内层循环记录比较的次数(当大数沉底后,比较次数也会随着趟数依次减少)
            for (int j = 0; j < array.length-1-i; j++) {
                int tmp = 0;
                //进行比较并进行数值的交换
                if(array[j ] > array[j+1]){
                    tmp = array[j];
                    array[j] = array[j+1];
                    array[j+1] = tmp;
                }
            }
        }
        return array;
    }

    public static void main(String[] args) {
        int[] array = {25,6,56,24,9,12,55};
        Sort(array);
        for (int i = 0; i < array.length; i++) {
            System.out.print(array[i]+" ");

	        }

   		 }
    }

代码运行结果:
在这里插入图片描述

上述代码是最基本的冒泡排序方法,比较耗时耗力。如果比较数字数目较大并且有一部分数字已经有序时,那么以上方法还是会对有序的数字进行比较排序,会加大时间消耗。所以针对以上问题进行优化,我们可以提前设置一个标识order,如果此次循化下来发生了交换,则为true,否则说明排序已完成,为false。

代码实现:

public class TestDemo {
    public static int[] Sort(int[] array){
        //用order来记录前面的数字是否已经有序
        boolean order = true;
        for (int i = 0; i < array.length-1; i++) {
            for (int j = 0; j < array.length-1-i; j++) {
                int tmp = 0;
                if(array[j ] > array[j+1]){
                    tmp = array[j];
                    array[j] = array[j+1];
                    array[j+1] = tmp;
                    order = true;
                }
            }
            //如果没有发生交换,则证明已经有序,退出外部循环
            if (!order){
                break;
            }
        }
        return array;
    }

    public static void main(String[] args) {
        int[] array = {25,6,56,24,9,12,55};
        Sort(array);
        for (int i = 0; i < array.length; i++) {
            System.out.print(array[i]+" ");

        }

    }
}

代码运行结果:
在这里插入图片描述三,特性总结
①时间复杂度:
最优时间复杂度,最差时间复杂度分析和平均时间复杂度均为 O(n^2)。
②空间复杂度:
最优的空间复杂度就是起始元素顺序已经排好了,则空间复杂度为:0;
最差的空间复杂度就是起始元素都是逆序排序的,则空间复杂度为:O(n);
平均的空间复杂度为:O(1);
③稳定性:
稳定

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值