【排序算法】冒泡排序

排序动图

在这里插入图片描述

排序流程

依次比较向相邻两个数,如果后面的比前面大,则交换位置。

  • 总共比较几轮?

    总共比较 n-1 轮,因为最后一个数字没有后一个数。

  • 每一轮比较几次?

    第一轮需要比较 n-1 次。

    第二轮需要比较 n-2 次,因为最后一个数已经是最大的了,不需要再重新比较。

    由此可得出,每轮比较 n - 已经比较了几轮 - 1

    初始数组:int[] arr = new int[]{3, 2, 5, 1, 6, 8, 9, 4, 7}
    第一轮第一次:2	3	5	1	6	8	9	4	7
    第一轮第二次:2	3	5	1	6	8	9	4	7
    第一轮第三次:2	3	1	5	6	8	9	4	7
    第一轮第四次:2	3	1	5	6	8	9	4	7
    第一轮第五次:2	4	1	6	5	8	9	4	7
    第一轮第六次:2	4	1	6	5	8	9	4	7
    第一轮第七次:2	4	1	6	5	8	9	4	7
    第一轮第八次:2	4	1	6	5	8	4	9	7
    第一轮第九次:2	4	1	6	5	8	4	7	9
    

    经过一轮的九次比较交换的得出了最大的值 9,并排在了最后一位,此后的每一轮都能找出最大的一位,并排在最后一位。

代码实现

public static int[] bubbleSort(int[] arr) {
    // 总共比较数组的长度 - 1 轮
    for (int i = 0; i < arr.length - 1; i++) {
        // 每轮比较数组的长度 - i - 1 轮
        for (int j = 0; j < arr.length - i - 1; j++) {
            // 如果后面的前面的大
            if (arr[j] > arr[j+1]) {
                // 交换位置
                int temp = arr[j+1];
                arr[j+1] = arr[j];
                arr[j] = temp;
            }
        }
    }
    return arr;
}

代码优化

试想一下,有没有一种可能,这个数组本来就是已经排好序的了,那么我们就不需要在循环排序了。

如何判断数组是否已经排好序了呢?

假如一轮循环,都没有发生位置交换,那么就可以认为该数组已经排好序了。

public static int[] newBubbleSort(int[] arr) {
    // 定义一个替换中间变量
    int temp;
    // 定义一个标志,标志一轮循环是否发生了交替
    int change;
    // 循环比较第几轮
    for (int i = 0; i < arr.length - 1; i++) {
        // 设置标志为 0
        change = 0;
        // 每轮比较的次数
        for (int j = 0; j < arr.length - i - 1; j++) {
            // 后面的数大于前一个数,位置替换
            if (arr[j+1] < arr[j])  {
                temp = arr[j];
                arr[j] = arr[j+1];
                arr[j+1] = temp;
                // 已经比较,修改标志
                change = 1;
            }
        }
        // 如果一轮循环都没有发生交替,则说明数组已经排好序,结束排序
        if (change == 0) {
            return arr;
        }
    }
    return arr;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值