Java基础之冒泡排序算法及优化

博主前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住也分享一下给大家,
👉点击跳转到网站

概述

冒泡排序(Bubble Sorting)的基本思想是:通过对待排序序列从前向后(从下标较小的元素开始),依次比较相邻元素的值,若发现逆序则交换,使值较大的元素逐渐从前移向后部,就象水底下的气泡一样逐渐向上冒。

优化思路:
因为排序的过程中,各元素不断接近自己的位置,如果一趟比较下来没有进行过交换,就说明序列有序,因此要在排序过程中设置一个标志flag判断元素是否进行过交换。从而减少不必要的比较。(这里说的优化,可以在冒泡排序写好后,在进行)

图解冒泡排序的算法过程

在这里插入图片描述

一、废话不多说,直接上代码

public class Test13 {
    //冒泡排序,从小到大排序
    public static void main(String[] args) {
        int[] arry = new int[]{10, 20, -10, 0, 60, 89, 45, 30, 87, 99, 0, 40};

        for (int i = 0; i < arry.length - 1; i++) { //循环11次即可,循环的次数为实际个数-1

            for (int j = 0; j < arry.length - 1 - i; j++) { //比较的次数为arry.length-1-i ,每多一次循环循环次数就会-i
                if (arry[j] > arry[j + 1]) {
                    int temp = arry[j]; //先把值赋给arry[j] 赋给temp
                    arry[j] = arry[j + 1]; //把arry[j+1]赋值给arry[j]
                    arry[j + 1] = temp;//把temp赋给arry[j+1]

                }

            }


        }
        for (int i = 0; i < arry.length; i++) {
            System.out.print(arry[i]+"\t");
        }
    }
}

运行结果如下

> Task :Test13.main()
-10	0	0	10	20	30	40	45	60	87	89	99	

二、案例代码,具体注释已经在代码中给出

public class BubbleSort {
    public static void main(String[] args) {
//        int[] arr = {3, 9, -1, 10, 20};

//        System.out.println("排序前");
//        System.out.println(Arrays.toString(arr));

        //测试冒泡排序的速度O(n^2),给80000个数据,进行测试
        //创建一个80000个的随机数组
        int[] arr = new int[80000];
        for (int i = 0; i < 80000; i++) {
            arr[i] = (int) (Math.random() * 800000); //生成一个[0,800000)}

        Date date1 = new Date();
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String dateStr = simpleDateFormat.format(date1);
        System.out.println("排序前的时间是:" + dateStr);

        //测试冒泡排序
        bubbleSort(arr);

        Date date2 = new Date();
        String dateStr2 = simpleDateFormat.format(date2);
        System.out.println("排序后的时间是:" + dateStr2);

//        System.out.println("排序后");
//        System.out.println(Arrays.toString(arr));
        /*

        //第二趟排序,就是将第二大的数排在倒数第二位
        for (int i = 0; i < arr.length - 1 - 1; i++) {
            //如果前面的数,比后面的数大,则交换
            if (arr[i] > arr[i + 1]) {
                temp = arr[i];
                arr[i] = arr[i + 1];
                arr[i + 1] = temp;
            }
        }
        System.out.println("第二趟排序后的数组");
        System.out.println(Arrays.toString(arr));

        //第三趟排序,就是将第三个大的数排在倒数第三位
        for (int i = 0; i < arr.length - 1 - 2; i++) {
            //如果前面的数,比后面的数大,则交换
            if (arr[i] > arr[i + 1]) {
                temp = arr[i];
                arr[i] = arr[i + 1];
                arr[i + 1] = temp;
            }
        }
        System.out.println("第三趟排序后的数组");
        System.out.println(Arrays.toString(arr));

        //第三趟排序,就是将第四个大的数排在倒数第四位
        for (int i = 0; i < arr.length - 1 - 3; i++) {
            //如果前面的数,比后面的数大,则交换
            if (arr[i] > arr[i + 1]) {
                temp = arr[i];
                arr[i] = arr[i + 1];
                arr[i + 1] = temp;
            }
        }
        System.out.println("第四趟排序后的数组");
        System.out.println(Arrays.toString(arr));

         */
    }


    //将前面的冒泡排序,封装成一个方法
    public static void bubbleSort(int[] arr) {
        //冒泡排序的时间复杂度O(n^2),自己写出
        int temp = 0; //临时变量
        boolean flag = false; //标识变量,表示是否进行交换
        for (int j = 0; j < arr.length - 1; j++) {
            for (int i = 0; i < arr.length - 1 - j; i++) {
                //如果前面的数,比后面的数大,则交换
                if (arr[i] > arr[i + 1]) {
                    flag = true;
                    temp = arr[i];
                    arr[i] = arr[i + 1];
                    arr[i + 1] = temp;
                }
            }

//            System.out.println("第" + (j + 1) + "趟排序后的数组");
//            System.out.println(Arrays.toString(arr));
            if (!flag) { //在一趟排序中,一次交换都没有发生
                break;
            } else {
                flag = false; //重置flag!!!,进行下次判断
            }
        }
    }
}

输出结果如下:

排序前的时间是:2022-04-13 19:45:41
排序后的时间是:2022-04-13 19:45:50
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

路宇

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值