冒泡排序(从小到大)

冒泡排序

原理:比较两个相邻元素,大的放在后,第一次完毕后,最大值在数组的最后
先看一下图示,然后在解释:
在这里插入图片描述
第一次冒泡排序时:先比较20跟60,大的放后面,所以位置不变,再比较60跟80,一样不变,再比较80跟50,80较大,交换80跟50的位置,在拿交换后的80跟10比较,80同样较大,跟10交换位置。这样,第一次冒泡排序就结束了,看图可知,数组元素最大的80已经在最后面了
第二次冒泡排序时:拿第一次冒泡排序后的位置比较,先比较20跟60,位置不变,再比较60跟50,60大,交换位置,再比较60个10,交换位置,最后,60跟80就不用再继续比较了,因为前一次比较已经得到80是最大的了。这样,第二次冒泡排序就结束了,看图可知,数组元素第二大的已经在倒数第二个位置了
第三次冒泡排序时:拿第二次冒泡排序后的位置比较,先比较20跟50,位置不变,再比较50跟10,交换位置,后面就不用比较了。这样,第三次冒泡排序也结束了,看图可知,数组元素第三大的已经在第三个位置了
第四次冒泡排序:拿第三次冒泡排序后的位置比较,这时只需比较第一个和第二个元素大小即可,20比10大,交换位置。这样,由图可知,数组就已经按照从小到大的顺序排好了
总结分析:如果一个数组arr.length=5,也就是有5个元素,它就要经过(arr.length-1)次,也就是4次冒泡排序;第一次冒泡排序要比较(arr.length-1)次,第二次冒泡排序要比较(arr.length-2)次,第三次冒泡排序要比较(arr.length-3)次,第四次冒泡排序要比较(arr.length-4)次,这时,arr.length-4在这个数组中也就等于1,也就不用再比较了,因为就剩下自己,自己跟自己比没有意义
代码实现

package org.westos.demo2;

import java.util.Arrays;

public class Test {
    public static void main(String[] args) {
        int[] arr = {20, 60, 80, 50, 10};
        //第一次排序
        for (int i = 0; i < arr.length-1; i++) {
            //判断相邻元素大小,如果前面的比后面的大,则交换位置
            if(arr[i]>arr[i+1]){
                int temp = arr[i];
                arr[i] = arr[i+1];
                arr[i+1] = temp;
            }
        }
        //第二次排序
        for (int i = 0; i < arr.length-1-1; i++) {
            //判断相邻元素大小,如果前面的比后面的大,则交换位置
            if(arr[i]>arr[i+1]){
                int temp = arr[i];
                arr[i] = arr[i+1];
                arr[i+1] = temp;
            }
        }
        //第三次排序
        for (int i = 0; i < arr.length-1-1-1; i++) {
            //判断相邻元素大小,如果前面的比后面的大,则交换位置
            if(arr[i]>arr[i+1]){
                int temp = arr[i];
                arr[i] = arr[i+1];
                arr[i+1] = temp;
            }
        }
        //第四次排序
        for (int i = 0; i < arr.length-1-1-1-1; i++) {
            //判断相邻元素大小,如果前面的比后面的大,则交换位置
            if(arr[i]>arr[i+1]){
                int temp = arr[i];
                arr[i] = arr[i+1];
                arr[i+1] = temp;
            }
        }
        System.out.println(Arrays.toString(arr));
    }
}

运行结果:
在这里插入图片描述
第一次写,我们可以把每一次的排序过程写出来,由这四次可以看出,冒泡排序唯一的不同就是在执行判断语句的时候i<arr.length-1会随着次数的增加而减少,因为你在第二次排序的时候最后一个元素是不用跟前面的在比了,同理在第三次排序的时候最后两个元素也不用跟前面的比
可得出这样的结论:排序次数每增加一次,判断语句就多减1,那么我们可以再外面再套一个循环,达到操作判断语句的效果,这样,就不用一直写重复的代码
代码简化:

package org.westos.demo2;

package org.westos.demo2;

import java.util.Arrays;

class Demo {
    public static void main(String[] args) {
        int[] arr = {20, 60, 80, 50, 10};
        for (int j = 0; j < arr.length-1; j++) {//外层循环控制排序次数
            for (int i = 0; i < arr.length - 1 - j; i++) {
                //判断相邻元素大小,如果前面的比后面的大,则交换位置
                if (arr[i] > arr[i + 1]) {
                    int temp = arr[i];
                    arr[i] = arr[i + 1];
                    arr[i + 1] = temp;
                }
            }
        }
        System.out.println(Arrays.toString(arr));
    }
}

看看运行结果是否正确:
在这里插入图片描述
就这道题而言,再写外循环的时候可以直接写j<4,但这并不妥当,如果数组改变一下,这个代码就会不适用,所以要改动一下,就是让j<arr.length-1,为什么这样写,从上面的总结分析可以看出。这样,不管是哪个数组,这个简化代码都适用

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值