JAVA冒泡排序算法(含详细过程代码讲解及优化)

4 篇文章 0 订阅
1 篇文章 0 订阅


java冒泡排序

3,9,-1,10,-2这组数为例,对这组数使用冒牌排序使其有序

一、代码的拆分讲解

首先创建一个数组和一个用于三角交换的变量

int arr[] = {3,9,-1,10,-2};
int temp = 0;

首先进行第一趟

 //第一趟排序,就是将最大的数排在最后
        for (int j = 0; j < arr.length - 1; j++) {
            if (arr[j] > arr[j+1]){
                temp = arr[j];
                arr[j] = arr[j+1];
                arr[j+1] = temp;
            }
        }

第一趟的运行后的数组
在这里插入图片描述

然后第二趟

 //第一趟排序,就是将最大的数排在最后
        for (int j = 0; j < arr.length - 1-1; j++) {
            if (arr[j] > arr[j+1]){
                temp = arr[j];
                arr[j] = arr[j+1];
                arr[j+1] = temp;
            }
        }

第二趟的运行后的数组
在这里插入图片描述

第三趟

 //第一趟排序,就是将最大的数排在最后
        for (int j = 0; j < arr.length - 1 -2; j++) {
            if (arr[j] > arr[j+1]){
                temp = arr[j];
                arr[j] = arr[j+1];
                arr[j+1] = temp;
            }
        }

第三趟的运行后的数组
在这里插入图片描述

第四趟

 //第一趟排序,就是将最大的数排在最后
        for (int j = 0; j < arr.length - 1 -3; j++) {
            if (arr[j] > arr[j+1]){
                temp = arr[j];
                arr[j] = arr[j+1];
                arr[j+1] = temp;
            }
        }

第四趟的运行后的数组
在这里插入图片描述

下面是四趟代码的结果汇总:
在这里插入图片描述

从上面步骤,可以观察到每次的j都相对于前一趟进行-1操作,所以可以把这些操作套在一个for循环里来控制j即可。

二、冒泡排序的代码

下面为冒泡排序的代码,并把它写入bubblesSort方法里:

普通冒泡排序:

    public static void bubbleSort(int[] arr){
        //冒泡排序的时间复杂度为O(n*n)
        int temp = 0;//临时变量
        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]){
                    //三角交换
                    temp = arr[i];
                    arr[i] = arr[i+1];
                    arr[i+1] = temp;
                }
            }
        }
    }

优化的目的:数组有可能在中间某一过程就已经有序,无序再进行后面操作。

优化冒泡排序:

public static void bubbleSort(int[] arr){
        //冒泡排序的时间复杂度为O(n*n)
        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]){
                     //三角交换
                    temp = arr[i];
                    arr[i] = arr[i+1];
                    arr[i+1] = temp;
                    flag = true;
                }
            }
            //如果没有进入三角交换则证明数组已经有序,直接退出循环即可
            //如果进入了三角交换,把flag赋值为false,来判断下一次循环是否进入三角交换
            if (flag == false){
                break;
            }else {
                flag = false;
            }
        }
    }
  • 18
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值