冒泡排序算法详解(从前往后)

冒泡排序算法详解(从前往后)

A. 从第一个元素开始进行两两比较,保证第(数组长度-1-i)的位置的上是最大的------升序

1.核心代码

for (int i = 0; i <numbers.length-1; i++) {
     for (int j = 0; j <numbers.length-1-i; j++) {
         //从第一个元素,进行两两比较,
        // 前者比后者大就交换,保证最大的数都交换到了第(数组长度-1-i)个位置上去了
          if(numbers[j]>numbers[j+1]){
               int temp=numbers[j];
               numbers[j]=numbers[j+1];
               numbers[j+1]=temp;
           }
      }
}

2.常见问题点分析

2.1 如何进行冒泡排序???

目的:每次两两交换完后,保证第(数组长度-1-i)个位置是最大值

解决方案: 1.从第i个元素开始(初始为0),每次与后面的元素两两比较

​ 2.若前者大于后者,则进行值的交换,否则进入下一次循环操作

​ 3.当两两交换到最后位置(数组长度-1-i)的数时,本次交换结束

​ 下一次两两交换的范围缩短1,然后进行下一轮两两比较

​ 当执行完(数组长度-1)轮两两比较时,冒泡排序算法才执行结束

2.2 冒泡排序的循环次数为多少?

解决方案:循环次数=数组长度-1

2.3 冒泡排序具体操作(数字是这么移动的)过程

以数组int[] a=[6,3,4,1,-9]为列

排序次数需要排序的数组部分排序前的数组排序后的数组
第1次[6,3,4,1,-9][6,3,4,1,-9][3,4,1,-9,6]
第2次[3,4,1,-9][3,4,1,-9,6][3,1,-9,4,6]
第3次[3,1,-9][3,1,-9,4,6][1,-9,3,4,6]
第4次[1,-9][1,-9,3,4,6][-9,1,3,4,6]
2.4 为什么内层循环的判定条件为 j <numbers.length-1-i

理由:a.每两两交换一轮,范围缩小1,这与i的变化一直,因而-i

​ b.两两交换的首轮是交换到了数组的最后一个位置的数,

​ 此位置为numbers.length-1

​ c.两两交换的次数为numbers.length-1-i

2.5 为啥条件numbers[j]>numbers[j+1]满足时,要进行两两交换?

解答: 每交换一次时,使得两者之中的较大值往后移动一格

(这样大数都会往后移动了—>直到遇见比之还大的数字就终止移动)

​ 这样能在每轮两两交换完成后,最大值的下标为数组长度-1-i

2.6 两两交换一轮为多少次?

假设需要排序的数组长度为5,每次都符合交换条件

​ 当需要把最大值移动到最后一个位置(下标4)时,需要两两交换4次

​ 当需要把最大值移动到倒数第二个位置(下标3)时,需要两两交换3次

​ 当需要把最大值移动到第3个位置(下标2)时,需要两两交换2次

​ 当需要把最大值移动到第2个位置(下标1)时,需要两两交换1次

​ 此时冒泡结束

​ 因而两两交换次数=数组长度-1-i

3.运行截图

在这里插入图片描述

4.源代码

public class BubSort01 {
    public static void main(String[] args) {
        System.out.println("冒泡排序(从前往后)-----升序");
        int[] numbers={6,3,4,1,-9};
        System.out.println("排序前");
        for (int temp01:numbers
             ) {
            System.out.print(temp01+"\t");
        }
        for (int i = 0; i <numbers.length-1; i++) {
            for (int j = 0; j <numbers.length-1-i; j++) {
                //从第一个元素,进行两两比较,
                // 前者比后者大就交换,
                //保证最大的数都交换到了第(数组长度-1-i)个位置上去了
                if(numbers[j]>numbers[j+1]){
                    int temp=numbers[j];
                    numbers[j]=numbers[j+1];
                    numbers[j+1]=temp;
                }
            }
            System.out.println("\n第"+(i+1)+"次排序结果为:");
            for (int temp02:numbers
            ) {
                System.out.print(temp02+"\t");
            }
        }
        System.out.println("\n冒泡排序的最终结果为: ");
        for (int temp03:numbers
        ) {
            System.out.print(temp03+"\t");
        }
    }
}

B. 从第一个元素开始进行两两比较,保证第(数组长度-1-i)的位置的上是最小的------降序

1.核心代码

for (int i = 0; i <numbers.length-1; i++) {
    for (int j = 0; j <numbers.length-1-i; j++) {
        //从第一个元素,进行两两比较,
       // 前者比后者小就交换,保证最小的数都交换到了第数组长度-1-i个位置上去了
       if(numbers[j]<numbers[j+1]){
           int temp=numbers[j];
           numbers[j]=numbers[j+1];
           numbers[j+1]=temp;
        }
      } 
}

2.常见问题点分析

2.1 如何进行冒泡排序???

目的:每次两两交换完后,保证第(数组长度-1-i)个位置是最小值

解决方案: 1.从第i个元素开始(初始为0),每次与后面的元素两两比较

​ 2.若前者小于后者,则进行值的交换,否则进入下一次循环操作

​ 3.当两两交换到最后位置(数组长度-1-i)的数时,本次交换结束

​ 下一次两两交换的范围缩短1,然后进行下一轮两两比较

​ 当执行完(数组长度-1)轮两两比较时,冒泡排序算法才执行结束

2.2 冒泡排序的循环次数(外层)为多少?

解决方案:循环次数=数组长度-1

2.3 冒泡排序具体操作(数字是这么移动的)过程

以数组int[] a=[4,1,-9,22,23]为列

排序次数需要排序的数组部分排序前的数组排序后的数组
第1次[4,1,-9,22,23][4,1,-9,22,23][4,1,22,23,-9]
第2次[4,1,22,23][4,1,22,23,-9][4,22,23,1,-9]
第3次[4,22,23][4,22,23,1,-9][22,23,4,1,-9]
第4次[22,23][22,23,4,1,-9][23,22,4,1,-9]
2.4 为什么内层循环的判定条件为 j <numbers.length-1-i

理由:a.每两两交换一轮,范围缩小1,这与i的变化一直,因而-i

​ b.两两交换的首轮是交换到了数组的最后一个位置的数,

​ 此位置为numbers.length-1

​ c.两两交换的次数为numbers.length-1-i

2.5 为啥条件numbers[j]<numbers[j+1]满足时,要进行两两交换?

解答: 每交换一次时,使得两者之中的较小值往后移动一格

(这样小数都会往后移动了—>直到遇见比之还小的数字就终止移动)

​ 这样能在每轮两两交换完成后,最大值的下标为数组长度-1-i

2.6 两两交换一轮为多少次?

假设需要排序的数组长度为5,每次都符合交换条件

​ 当需要把最大值移动到最后一个位置(下标4)时,需要两两交换4次

​ 当需要把最大值移动到倒数第二个位置(下标3)时,需要两两交换3次

​ 当需要把最大值移动到第2个位置(下标2)时,需要两两交换2次

​ 当需要把最大值移动到第1个位置(下标1)时,需要两两交换1次

​ 此时冒泡结束

​ 因而两两交换次数=数组长度-1-i

3.运行截图

在这里插入图片描述

4.源代码

public class BubSort02 {
    public static void main(String[] args) {
        System.out.println("冒泡排序(从前往后)-----降序");
        int[] numbers={4,1,-9,22,23};
        System.out.println("排序前");
        for (int temp01:numbers
        ) {
            System.out.print(temp01+"\t");
        }
        for (int i = 0; i <numbers.length-1; i++) {
            for (int j = 0; j <numbers.length-1-i; j++) {
                //从第一个元素,进行两两比较,
                // 前者比后者小就交换,保证最小的数都交换到了第(数组长度-1-i)个位置上去了
                if(numbers[j]<numbers[j+1]){
                    int temp=numbers[j];
                    numbers[j]=numbers[j+1];
                    numbers[j+1]=temp;
                }
            }
            System.out.println("\n第"+(i+1)+"次排序结果为:");
            for (int temp02:numbers
            ) {
                System.out.print(temp02+"\t");
            }
        }
        System.out.println("\n冒泡排序的最终结果为: ");
        for (int temp03:numbers
        ) {
            System.out.print(temp03+"\t");
        }
    }
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

SSS4362

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

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

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

打赏作者

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

抵扣说明:

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

余额充值