2021-10-28JAVA冒泡排序

 复习下冒泡顺便发到CSDN记录下日常。

个人感觉冒泡排序理解了概念以后写起来简单,

主要是要先理解冒泡排序的概念,就是从后往前或者从前往后两两比较相邻元素的值,再选择交不交换位置,从下述倒叙排列理解:即一轮比较结束后即可选出数组元素最小值放到数组的末尾,

 以

int[] b = {666,3223,234,83,53,87,5,4,3,2,999};

为例, 666小于3223 互换位置,666大于234位置不变,234大于83,省略······

一轮循环后可得,

[3223, 666, 234, 83, 87, 53, 5, 4, 3, 999, 2]

 即只需要进行数组长度length-1次循环即可成功排列出递减数组序列,

每次两两比较也需要比较length-1次,

由此我们只需要一个for循环负责控制需要循环多少趟,在里面嵌套一个for循环负责控制本趟的循环次数。

b[] 数组总共有11个数组元素,则我们就需要两两比较10趟数组,每趟比较10次,我们直接用.length方法来调用数组长度,减去1是因为计算是从零开始的。

 for (int i = 0; i < b.length - 1; i++) {      

            for (int j = 0; j < b.length - 1; j++) {

 至此冒泡循环的核心双重嵌套循环就出来啦,剩下的flag或者counts都是优化外层循环次数所加的额外代码,可以直接删去。

菜鸟程序员一名!欢迎大家交流互动,指导批评。

 完整代码如下:

import java.util.Arrays;

public class BubbleSort {


    public static void main(String[] args) {

        /**
         * 作者:西瓜
         * Date:2021年4月8日19:44:24
         * 冒泡排序
         * 每一趟循环都将相邻元素比较大小并交换相应位置,最终选出本趟循环的max或min值放在首位
         * 经过两次嵌套循环,时间复杂读为O(n*2)
         */
     
         
        int[] b = {666,3223,234,83,53,87,5,4,3,2,999};
       	 
        int counts=0;
       
        for (int i = 0; i < b.length - 1; i++) {

            boolean flag = false;  //判断本次是否进行了元素交换,默认为false.

            for (int j = 0; j < b.length - 1; j++) {

                counts++;

                if(b[j]<b[j+1]){

                    int temp = b[j];
                    b[j]=b[j+1];
                    b[j+1]=temp;

                    flag = true;

                   

                }


            }
            if(flag==false){
                break;//如果此轮循环未发生交换 则说明数组已经是有序数列,优化外层循环次数。可以通过注释此段代码观察counts的变化来理解。
            }


        }

        /**
         * 如果直接sout(b)会输出数组第一个元素的地址
         * 此时可用for循环遍历整个数组或者使用Arrays的toString()方法
         
         */

        System.out.println(Arrays.toString(b));
        System.out.println(counts);
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值