Java算法:冒泡排序--优化最终版

算法描述:
  1. 依次比较数组中相邻两个元素大小,若 a[j] > a[j+1],则交换两个元素,两两都比较一遍称为一轮冒泡,结果是让最大的元素排至最后

  1. 重复以上步骤,直到整个数组有序

优化
  • 每轮冒泡时,最后一次交换索引可以作为下一轮冒泡的比较次数,如果这个值为零,表示整个数组有序,直接退出外层循环即可

  • 举例:

  • int[ ] a={5,2,7,4,1,3,8,9}

  • 第一轮冒泡结束之后: 结果为[2, 5, 4, 1, 3, 7, 8, 9]

  • 可以看到,最后面的几个元素已经有序了,那么此时我们需要比较的就只有7前面的那些数字

代码实现
import java.util.Arrays;

public class BubbleSort {
    public static void main(String[] args) {
        int[] a={5,2,7,4,1,3,8,9};
        bubble(a);
    }

    //冒泡排序方法
    private static void bubble(int[] a) {
        /*
        关于比较:
         一开始,需要比较a.length-1次,
         每一轮的冒泡结束之后,最大的元素都会排在后面
         如果后面某几个元素已经有序,则不需要比较
         */
        //定义变量n,用于记录每一次元素比较的次数
        int n=a.length-1;
        //如果比较次数为0的话,表示这组元素已经有序了,所以while循环的结束条件是 n=0
        while (true){
            //last表示最后一次交换位置的索引
            int last=0;
            //表示每一轮的冒泡
            for (int i = 0; i < n; i++) {
                //如果前一个元素的值比后一个元素的值大,就交换位置
                if (a[i]>a[i+1]){
                    swap(a,i,i+1);
                    //注意:此时我们用last记录下某个元素最后一次交换位置的索引
                    last=i;
                }
            }
            //每一轮冒泡结束之后,记录下来的last,即某个元素最后一次交换位置的索引
            // 这就是剩余元素的交换次数,因为在此之后,没有元素需要交换了
            n=last;
            System.out.println("冒泡结果:"+ Arrays.toString(a));
            if (n==0){
                break;
            }
        }

    }
    //交换两个元素位置的方法
    private static void swap(int[] a,int i,int j) {
        int t=a[i];
        a[i]=a[j];
        a[j]=t;
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值