冒泡排序 (小优化)

时间复杂度:O(n²)  

空间复杂度:1   

稳定性:稳定

冒泡排序的原理是:从左到右,相邻元素进行比较。每次比较一轮,就会找到序列中最大并且将这个数放到数组的相应位置。
比如对下面这个序列进行从小到大排序:

5, 9, 2, 7, 4, 1, 8, 3, 6

第一轮:
1) 5 和 9比,5 < 9,则它们不交换位置

5, 9, 2, 7, 4, 1, 8, 3, 6

2) 9 和 2 比,9 > 2,则交换位置

5,  2,  9,  7,  4,  1,  8,  3,  6

3)9 和 7 比,9 > 7,则它们互换位置

5,  2,  7,  9,  4,  1,  8,  3,  6

依次类推: 第一轮比较完之后找到了序列中最大的那个数,并被调换到最右边。

5,  2,  7,   4,  1,  8,  3,  6,9

第二轮:
1) 5 和 2 比,5 > 2,则交换位置。

2,  5,  7,   4,  1,  8,  3,  6,9


2) 5和7比较, 5  < 7, 不交换位置

2,  5,  7,   4,  1,  8,  3,  6,9

依次类推:第二轮比较完之后,就找到第二大的数,将第二大的数交换到了数组的倒数第二个位置。

2,  5,  4,  1,  8,  3,  6,7,9

 依次循环:就得到了有序的数组。

package sort;

/**冒泡排序( 小 --> 大)
 * @author codelmh
 * @data 2021/11/18
 */
public class BubbleSort {
    public static void main(String[] args) {
        int[] arr = {5, 9, 2, 7, 4, 1, 8, 3, 6};
        /**
         * 思路:
         * 1.arr[j] 与 arr[j+1] 比较
         * 2.若 arr[j]大于 arr[j+1] 则进行位置交换, 否则不进行交换操作
         * 循环进行操作 1,2 直到数组值循环完之后
         * 第一次循环完,最大的值将会交换到数组的最后
         * 第二次循环完,第二大的值将会交换到数组的倒数的第二个位置
         * 所以得到内循环条件  j < arr.length-1-i
         *
         * 优化思想: 若还没有开始就是有序的 如何判断结束循环 达到冒泡排序的最优时间复杂度O(n)
         * 思路: 判断条件  某一次循环没有一次发生位置改变 则说明数组已经有序
         * 设置一个 flag = false
         * 在位置交换的时候 将 flag = true
         * 在本次循环结束后 判断 flag 是否等于 false
         * 等于 则 没有交换 不等于 则将 flag重置为 flag = true
         */
        boolean flag = false;
        for(int i = 0; i < arr.length - 1; i++){
            for (int j = 0; j < arr.length - 1 - i; j++){
                if (arr[j] > arr[j + 1]) {
                    flag = true;
                    int temp = arr[j];
                    arr[j] = arr[j + 1];
                    arr[j + 1] = temp;
                }
            }
            if (!flag) break;
            flag = false;
        }
        //打印数组
        SortUtils.print(arr);
    }
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值