Java实现冒泡排序及其优化

冒泡排序(Bubble Sort):从左至右(从下标较小的元素开始)依次比较相邻元素的值,若发现逆序则交换,使较大的元素逐渐从前移向后部。

冒泡排序的规则(以数组 arr= {3, 9, -1, 10, 20}为例):

1.一共进行数组的大小 - 1 (arr.length  - 1) 次的大循环(趟数);

2.每一趟(每一次大循环)排序的次数逐渐减少:第一趟下来后,最大的数已经确定下来(在数组的最后),因此第二趟较第一趟排序对比的次数少;

3.优化方案:如果我们发现在某趟排序中,没有发生过一次交换,则可以提前结束冒泡排序。可在排序过程中设置一个标识(flag),用于判断元素是否进行过交换。

Java实现如下所示:

import java.util.Arrays;

public class BubbleSort {

    public static void main(String[] args){

        int[] arr = {3, 9, -1, 10, 20};; //{3, -1, 9, 10, 20};//{3, 9, -1, 10, 20};
        
        bubbleSort(arr);

        //System.out.println(Arrays.toString(arr));
    }

    //冒泡排序算法
    public static void bubbleSort(int[] arr){
        int temp = 0;
        
        boolean flag = false; //标识变量,标识冒泡过程中是否进行过交换
        
        //冒泡排序的时间复杂度为 O(n^2)
        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;
                    temp = arr[j];
                    arr[j] = arr[j+1];
                    arr[j+1] = temp;
                }
            }
            System.out.println("第" + (i+1) + "趟排序: " + Arrays.toString(arr));
            
            if(flag == false){ //在一趟排序中,一次位置交换都没有发生过
                break;
            }else{
                flag = false; //重置flag 进行下趟判断,如果不重置flag,则flag为true后,则无法跳出循环,优化就无从谈起
            }
        }

    }
    
}

特别要注意的是 flag 在不等于false时,要重置其为false,从而进行下次判断,如果不重置flag,则flag为true后,则无法跳出循环,优化就无从谈起

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值