冒泡排序优化算法

package com.arraypro.array;

import java.util.Arrays;

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

        bubbleSort(values);
        System.out.println(Arrays.toString(values));

    }
    public static void bubbleSort(int[] values){
        /**
         * 就以3,1,8,4,7,2,6,9,5来说  这个使用冒泡排序,冒泡排序内层循环要比外层循环少一次,
         * i是外层循环次数 每完成一次循环, i自增1   array.length是数组的长度,数组中有9个数字 那么长度array.length就是9
         *  首先进行第一次外循环,i自增1,此时的内循环(一次换位为一次内循环)如下:1比3小,1和3换位,结果1,3,8,4,7,2,6,9,5,然后3和8对比 换位1,3,8,4,7,2,6,9,5
         * 以此类推,此次内循环总共换位8次(length-1即9-1),换位结束时9在最后,第一次外循环对应的内循环结束,进行第二次外循环。
         * 进行第二次循环 我们要先清楚 i现在的值是1,我们的数组中2 的位置已经定下不用再将拉入内循环对比大小换位,所以内层循环次数要比第一次少一次,所以要减1,即array.length-1-1
         * 进行第三次循环 我们要先清楚 i现在的值是2,我们的数组中2 5的位置已经定下不用再将拉入内循环对比大小换位,所以内层循环次数要比第二次少一次,所以要减2,array.length-1-2;
         */
        int temp;
        int i;
        //外层循环:n个元素排序,则至多需要n-1趟循环
        for(i=0;i<values.length;i++){
            //定义一个布尔类型的变量,标记数组是否已达到有序状态
            boolean flag = true;
            /**
             * 内层循环,每一趟循环都从数列的前两个元素进行比较,比较到无序的数组的最后
             */
            for(int j=0;j<values.length-1-i;j++){
                //如果前一个元素大于后一个元素,则交换两元素的值;
                if (values[j]>values[j+1]){
                    /**
                     * tem相当于引入的中间变量,排序的交换过程实际上数组中数的换位置
                     *起初,value[j]=3,把3给了temp;
                     * value[j+1]=1,把1给了value[j];
                     * temp=3,把3给了value[j+1]
                     * 数组中的值比较后交换完毕,
                     */
                    temp = values[j];
                    values[j] = values[j+1];
                    values[j+1] = temp;
                    //本趟发生了交换,表明噶Isuzu再本趟处于无序状态,需要继续比较
                    flag = false;
                }
            }
            //根基标记量的值判断数组是否有序,如果有序,则退出,无序,则继续循环
            if (flag){
                break;
            }
        }

    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值