冒泡排序---------java实现

一、冒泡排序

平均时间复杂度: O(n²)
最差时: O(n²)
是否稳定: 稳定
空间开销:O(1)
适合n较小时

原始数组:3 , 9, -1, 8, 2

第一趟排序:
(1) 3, 9, -1, 8,2
(2) 3, -1, 9,8, 2
(3) 3, -1, 8, 9, 2
(4)3, -1, 8, 2, 9 9确定
第二趟排序:
(1)-1,3, 8, 2, 9
(2)-1, 3, 8, 2, 9
(3)-1,3,2, 8, 9 8 , 9确定
第三趟排序:
(1)-1,3 ,2 ,8 , 9
(2)-1, 2, 3 ,8 ,9 3, 8, 9确定
第四趟排序:
(1)-1, 2, 3, 8, 9 (2, 3, 8, 9确定)

实现:

int[] array = {3, 9, -1, 8, 2};

        int temp=0;
        for (int i=0; i< array.length-1;i++){
            System.out.println("开始第"+(i+1)+"趟排序");
            for (int j=0;j<array.length-1-i;j++){
                if (array[j]>array[j+1]){
                    temp=array[j];
                    array[j]=array[j+1];
                    array[j+1]=temp;
                }
                System.out.println(Arrays.toString(array));

            }
            System.out.println("第"+(i+1)+"趟排序结果:");
            System.out.println(Arrays.toString(array));
            System.out.println("------------------");
        }

结果:
开始第1趟排序
[3, 9, -1, 8, 2]
[3, -1, 9, 8, 2]
[3, -1, 8, 9, 2]
[3, -1, 8, 2, 9]1趟排序结果:
[3, -1, 8, 2, 9]
------------------
开始第2趟排序
[-1, 3, 8, 2, 9]
[-1, 3, 8, 2, 9]
[-1, 3, 2, 8, 9]2趟排序结果:
[-1, 3, 2, 8, 9]
------------------
开始第3趟排序
[-1, 3, 2, 8, 9]
[-1, 2, 3, 8, 9]3趟排序结果:
[-1, 2, 3, 8, 9]
------------------
开始第4趟排序
[-1, 2, 3, 8, 9]4趟排序结果:
[-1, 2, 3, 8, 9]
------------------
总结:

1.共进行数组大小-1次循环
2.每次排序的次数逐渐减少

优化:

若一趟排序中没有一次交换,则停止循环
增加标志变量flag=false,发生交换时,置flag为true,一次循环后判断flag,若为true,则重置flag为false继续循环,否则break;

 int[] array = {3, 9, -1, 8, 2};

        boolean flag=false;
        int temp=0;
        for (int i=0; i< array.length-1;i++){

            System.out.println("开始第"+(i+1)+"趟排序");
            for (int j=0;j<array.length-1-i;j++){
                if (array[j]>array[j+1]){
                    temp=array[j];
                    array[j]=array[j+1];
                    array[j+1]=temp;
                    flag=true;
                }
                System.out.println(Arrays.toString(array));

            }
            System.out.println("第"+(i+1)+"趟排序结果:");
            System.out.println(Arrays.toString(array));
            System.out.println("------------------");

            if (!flag){
                //未发生一次交换,flag为false
                break;
            }else {
                //发生了交换,flag被置为true
                flag=false; //重置flag,继续循环
            }
        }

这里因为数据原因仍然执行了4次
可以换一组数据:{3,9,-1,8,10}
结果:

开始第1趟排序
[3, 9, -1, 8, 10]
[3, -1, 9, 8, 10]
[3, -1, 8, 9, 10]
[3, -1, 8, 9, 10]1趟排序结果:
[3, -1, 8, 9, 10]
------------------
开始第2趟排序
[-1, 3, 8, 9, 10]
[-1, 3, 8, 9, 10]
[-1, 3, 8, 9, 10]2趟排序结果:
[-1, 3, 8, 9, 10]
------------------
开始第3趟排序
[-1, 3, 8, 9, 10]
[-1, 3, 8, 9, 10]3趟排序结果:
[-1, 3, 8, 9, 10]
------------------

可以看到只执行了三次排序

测试十万条数据执行时间:
 //创建50000个随机数组
        int[] array =new int[100000];
        for (int i=0;i<100000;i++){
            array[i]=(int)(Math.random()*100000);
        }

        long begintime=System.currentTimeMillis();
        System.out.println("开始时间"+begintime);

        bubbleSort(array);
        long endtime=System.currentTimeMillis();
        System.out.println("结束时间"+endtime);
        System.out.println("用时:"+(endtime-begintime)+"ms");

结果:

开始时间1572061280770
结束时间1572061302883
用时:22113ms

当然每次执行时间不一样,但当数据大的时候总体效率还是很低的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值