6.1-冒泡排序

package com.hejiale.arithmetic.sort.bubble;

public class BubbleSort {

    static int[] arr = {3, 9, -1, 10, 20, 13, 2, 6, 23, -2, -5, 21};

    public static void main(String[] args) {
        /*
            1.  冒泡排序的思路:
                冒泡排序通过元素两两的依次比较,每次会将最大值或最小值交换到数组的最后,也就是说,每一趟排序,都会有一个
                元素到达固定位置,这就是冒泡排序的核心
            2.  代码实现:
                非常简单,我们只需要定义两个for循环
                    1.  第一个for循环定义的是循环的趟数,五个元素就遍历四趟,依次类推
                    2.  第二个for循环负责具体的循环操作,但是这里有一个注意事项
                        注意:
                            注意for循环每次的判断,应该设置为 j + 1 < arr.length - i
                                1.  左边:j+1,因为我们每次是a[j]和a[j+1]交换,所以我们要防止j+1越界异常
                                2.  右边:arr.length - i,因为每一趟排序后,就会得到一个最大值,也就是一个
                                    元素的最终位置已经固定了,所以后面循环的时候,我们就不需要和位置已经固定的
                                    元素进行比较了,因为肯定不会发生交换,以此类推,当循环了两趟后,就有两个元素
                                    的位置固定了,也就不用和后两个元素比较,因此得出arr.length-i
            3.  代码优化:
                如果,在一趟排序中,一次交换也没有发生,那么我们就可以认为,此时的数组已经有序了,就可以停止循环并输出
                数组了
                所以我们设置一个标志flag,每趟循环前设置初始值为false,一旦发生交换就设置flag为true,然后每趟循环的
                最后我们进行判断,如果flag为false,说明该趟排序没有发生交换,就无需在进行排序了,break跳出外层循环
        */
        bubble(arr);
        print();
    }

    //冒泡排序
    public static int[] bubble(int[] arr) {
        int temp = 0;//临时变量,用于交换
        boolean flag = false;//flag为true代表出现交换,为false代表没有交换

        for (int i = 0; i < arr.length - 1; i++) {//5个元素,要排序四趟,外层for循环定义的是循环趟数
            flag = false;//每趟排序前都要进行flag的重置,否则flag有可能就一直为true,即使已经提前排好序了,也无法变为false从而结束排序
            for (int j = 0; j + 1 < arr.length - i; j++) {//内层for循环定义的是具体的排序操作
                if (arr[j] >= arr[j + 1]) {//如果有乱序的情况,就交换
                    temp = arr[j + 1];
                    arr[j + 1] = arr[j];
                    arr[j] = temp;
                    flag = true;
                }
            }
            if (!flag) { // 如果一趟排序没有出现交换,则退出排序,因为此时,数组已经有序
                break;
            }
        }
        return arr;
    }

    //打印数组
    public static void print() {
        // 输出排序后的数组
        for (int i : arr) {
            System.out.print(i + "\t");
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值