冒泡算法的思路及改进

 

目录

 

冒泡排序

代码1:

代码2:

【改进1】如果元素含有升序的序列:

思路:第一轮for循环其实就可以确定是否序列内是否含有升序的序列

方法:

优点:如果一个序列的部分是有序的,那么有一定的优化作用。含大量的内部有序序列则优化作用很大。

缺点:每次需要多运行3个多余的语句,反而对于一般的无序的序列,运行的时间会更长


冒泡排序

代码1:

public class Main {
    public static void main(String[] args) {
        //冒泡排序
        int[] array = {16, 12, 17, 89, 72, 67, 1};
        //for(){}
            for (int i = 1; i < array.length; i++) {//从[数组[1]开始,数组的长度]这个区间。遍历6次
                if (array[i] < array[i - 1]) {
                    int temp = array[i];//交换两个数字的时候先存小的
                    array[i] = array[i - 1];//再大的给小的
                    array[i-1] = temp;//最后存的小的给大的
                }
            }
        for(int i = 0; i < array.length; i++){
            System.out.print(array[i] + "_");
        }
    }
}

此处写成for(int i =1;  i<= array.length - 1; i++)也可以

记住array.length是7,不能想当然地认为是最后一个元素没有被遍历到。

之后要让所有元素都排序,需要每次排序的长度递减,array.length是在不断变化的。

增加for循环,进行递减。

代码2:

public class Main {
    public static void main(String[] args) {
        //冒泡排序
        int[] array = {16, 12, 17, 89, 72, 67, 1};
        for(int end = array.length - 1;end > 0; end--){//length-1是需要每次排序的长度递减7元素只需要6次排序即可,六次都要执行完才行所以end > 0
            for (int i = 1; i <= end ; i++) {//用end代替了array.length,但是此处要执行7次所以<号要加等号
                if (array[i] < array[i - 1]) {
                    int temp = array[i];
                    array[i] = array[i - 1];
                    array[i-1] = temp;
                }
            }
        }
        for(int i = 0; i < array.length; i++){
            System.out.print(array[i] + "_");
        }
    }
}



理解数组长度为n是的下标[0]和for循环次数和<、<=,>、>=之间的关系

for(int end = array.length - 1;end > 0; end--){}

 遍历数组长度-1次。

【改进1】如果元素含有升序的序列:

思路:第一轮for循环其实就可以确定是否序列内是否含有升序的序列

方法:

增加一个boolean类型的sorted,假定本次对前面的元素比较都是升序的。

来判断本次是否进入了if(),若进入了,进行if(sorted),继续执行外循环遍历短了一次的数组;

若本次未进入,则代表此次的遍历的元素的后方元素都是大于它的,继续执行外循环遍历短了一次的数组;

public class Main {
    public static void main(String[] args) {
        //冒泡排序
        int[] array = {16, 12, 17, 89, 72, 67, 1};
        for(int end = array.length - 1;end > 0; end--){
            boolean sorted = true;//增1
            for (int i = 1; i <= end ; i++) {
                if (array[i] < array[i - 1]) {
                    int temp = array[i];
                    array[i] = array[i - 1];
                    array[i-1] = temp;
                    sorted =false;//增2
                }
            }
            if(sorted) break;//增3
        }
        for(int i = 0; i < array.length; i++){
            System.out.print(array[i] + "_");
        }
    }
}

优点:如果一个序列的部分是有序的,那么有一定的优化作用。含大量的内部有序序列则优化作用很大。

缺点:每次需要多运行3个多余的语句,反而对于一般的无序的序列,运行的时间会更长

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值