【原创】增强版冒泡排序算法-java版

6 篇文章 0 订阅

原创文章,转载请注明出处。

原理:第N趟循环,如果已经没有移动元素的操作,说明排序已完成,循环应该退出,不必再执行后续的循环操作,因为就算比较也不会再有元素会被移动。增加此控制计数器。控制循环退出。

如下程序,其实第6趟就已经排序完成,没有可移动的元素了。但是还是走了10趟排序。是非常不必要的。

 public static void maoPaoSortOld(int []array) {
            for (int i = 1; i < array.length; i++) {
                for (int j = 0; j < array.length - i; j++) {
                    if (array[j] > array[j + 1]) {
                        int temp = array[j];
                        array[j] = array[j + 1];
                        array[j + 1] = temp;
                    }
                }
                String arrString =buildStr(array);
                System.out.println("外层排序结束,第"+i+"轮,元素结构"+arrString);
            }
        }

外层排序结束,第1轮,元素结构[4,24,1,3,15,2,60,54,40,45,63]

外层排序结束,第2轮,元素结构[4,1,3,15,2,24,54,40,45,60,63]
外层排序结束,第3轮,元素结构[1,3,4,2,15,24,40,45,54,60,63]
外层排序结束,第4轮,元素结构[1,3,2,4,15,24,40,45,54,60,63]
外层排序结束,第5轮,元素结构[1,2,3,4,15,24,40,45,54,60,63]
外层排序结束,第6轮,元素结构[1,2,3,4,15,24,40,45,54,60,63]
外层排序结束,第7轮,元素结构[1,2,3,4,15,24,40,45,54,60,63]
外层排序结束,第8轮,元素结构[1,2,3,4,15,24,40,45,54,60,63]
外层排序结束,第9轮,元素结构[1,2,3,4,15,24,40,45,54,60,63]
外层排序结束,第10轮,元素结构[1,2,3,4,15,24,40,45,54,60,63]


改良后的增强版冒泡排序法:

/**
 * Created by lirong5 on 2016/6/13.
 */
public class SortTest {
        public static void main(String[] args) {
            int []array={63,4,24,1,3,15,2,60,54,40,45};
            maoPaoSort(array);
        }
        /**
         * 增强版冒泡排序法,从第cycleCount次开始,没有移动元素位置,即可证明排序完成,退出排序。
         * */
        public static void maoPaoSort(int []array) {
            int innerMoveCount = 0;//内层移动元素总次数
            for (int i = 1; i < array.length; i++) {
                boolean flag=true;//第i趟循环,如果有移动元素,更改此值,不可退出外层循环,如无元素被移动,排序已完成。退出循环。
                for (int j = 0; j < array.length - i; j++) {
                    if (array[j] > array[j + 1]) {
                        int temp = array[j];
                        array[j] = array[j + 1];
                        array[j + 1] = temp;
                        innerMoveCount++;
                        flag=false;
                    }
                }
                String arrString =buildStr(array);
                System.out.println("外层排序结束,第"+i+"轮,元素结构"+arrString);
                if(flag){
                    break;
                }
            }
            System.out.println("总共移动元素次数:"+innerMoveCount);
        }

    public static String buildStr(int []array){
        String rtnStr = "[";
        for (int i : array){
            rtnStr +=i+",";
        }
        return rtnStr.substring(0,rtnStr.length()-1)+"]";
    }
}

控制台输出:

外层排序结束,第1轮,元素结构[4,24,1,3,15,2,60,54,40,45,63]
外层排序结束,第2轮,元素结构[4,1,3,15,2,24,54,40,45,60,63]
外层排序结束,第3轮,元素结构[1,3,4,2,15,24,40,45,54,60,63]
外层排序结束,第4轮,元素结构[1,3,2,4,15,24,40,45,54,60,63]
外层排序结束,第5轮,元素结构[1,2,3,4,15,24,40,45,54,60,63]
外层排序结束,第6轮,元素结构[1,2,3,4,15,24,40,45,54,60,63]
总共移动元素次数:24

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

长乐smile

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值