文章目录

  • 前言
  • 一、冒泡排序原理
  • 二、代码实现
  • 1.基础实现
  • 2.代码优化
  • 总结




前言

我之前发过一个关于冒泡排序(用C语言实现)的文章,但是感觉没有循序渐进,对于编程入门的小白不是很友好,所以我打算再发一篇关于冒泡排序的文章。


一、冒泡排序原理

对于编程入门的小伙伴来说,冒泡排序应该是最熟悉的排序方法了,那么让我们回顾一下冒泡排序的原理。

首先给出一个数组 int arr[4] 如下

8

3

5

2

比较第一个元素与第二个元素,如果arr[0]>arr[1]则交换arr[0]与arr[1],然后再让第二个元素与第三个元素比较,一直这么比较到最后一个元素,这样就可以让最大的元素排在数组的最末端位置。

3

5

2

8

可以将数组的末端想象成水面,大元素相当于大气泡,最大的气泡会最先浮出水面(挺形象的哈)

比完一次后,最大的元素已经排好了,接下来再次重复上述比较,就可以让第二大的元素排好。一直这么比,数组就排好了。

3

2

5

8

当然,这个思路有许多优化空间,但大体思路就是如此。

二、代码实现

1.基础实现

import java.util.Arrays;

public class work_1 {
    public static void main(String[] args) {
        //要修改该数组直接在大括号里该元素就可以
        int arr[]=new int[]{6,3,8,9,1,3,4,2,5,9,0,2,8};
        //arr.length代表该数组有多少元素,在这里代表13

        System.out.println(Arrays.toString(arr));//以字符形式打印数组

        //以下是冒泡排序基础写法
        //外层循环控制循环次数
        for (int i = 0; i < arr.length; i++) {
            //内层循环控制下标
            for (int j = 0; j < arr.length-1; j++) {
                //要使arr[i+1]不越界,则当j+1==arr.length时,该循环进行最后一次,故j<arr.length-1
                if(arr[j]>arr[j+1]){
                    //交换三连
                    int tmp=arr[j];
                    arr[j]=arr[j+1];
                    arr[j+1]=tmp;
                }
            }
        }

        System.out.println(Arrays.toString(arr));//以字符形式打印数组

    }
}

Android中冒泡排序 冒泡排序java原理_java

2.代码优化

import java.util.Arrays;

public class work_1 {
    public static void main(String[] args) {
        int arr[]=new int[]{6,3,8,9,1,3,4,2,5,9,0,2,8};
        System.out.println(Arrays.toString(arr));

        //以下是冒泡排序优化写法
        //当循环进行到最后一次时,只剩下了最后一个元素排在最前面,相当于已经排好了,故可以省略一次比较,即i<arr.length-1
        int flage=0;//默认标记为0,代表该数组已经有序
        for (int i = 0; i < arr.length-1; i++) {
            //当排完一次后,之后不管怎么排,最后一个元素始终是最大的,故可以不用比较,它是有序的
            //这样想的话,每次排序都会生成一个有序元素,所以循环下标无需遍历后面的有序元素,故j<arr.length-1-i
            for (int j = 0; j < arr.length-1; j++) {
                if(arr[j]>arr[j+1]){
                    int tmp=arr[j];
                    arr[j]=arr[j+1];
                    arr[j+1]=tmp;
                    flage=1;//如果存在元素交换,则代表该数组无序,仍然需要排序
                }
            }
            if(flage==0){
                //如果内层循环走完了一次都没有元素交换的话,说明该数组已经有序,无需排列,故跳出循环
                break;
            }else{
                //若flage!=0,则该数组仍然需要排序,将flage恢复到默认值
                flage=1;
            }
        }

        System.out.println(Arrays.toString(arr));

    }
}

Android中冒泡排序 冒泡排序java原理_java_02


 

总结

冒泡排序不难,下去手敲一遍一定可以理解的。