编程必备:排序算法之冒泡排序,就是这么简单


本篇文章教你最基础的排序算法之一冒泡排序


一、概念解释

冒牌排序:这个算法的特点就是让最大的数字慢慢的冒泡浮到末端,故称冒泡排序

具体过程:如果数组的长度为8,那么冒泡排序的比较共有7轮(n-1),每一轮将最大的数字筛选移至末端

具体每一轮的比较方式是从最前面开始相邻两个数字两两比对,把较大的数字放至右侧,以此类推,每一轮就可以将最大的数字放至末端。


二、图片辅助理解

我们假设有一个数组如下,长度为8

int arr[] = {33,19,62,89,8,18,75,29};


第一轮排序如下:

第一轮

第一次排序:33和19比较,33比19大,交换位置

第二次排序:33和62比较,33比62小,不用交换

第三次排序:62和89比较,62比89小,不用交换

第四次排序:89和8比较,89比8大,交换位置

第五次排序:89和18比较,89比18大,交换位置

第六次排序:89和75比较,89比75大,交换位置

第七次排序:89和29比较,89比29大,交换位置

第一轮交换结束,最大的数是89,移动至最末端


第二轮排序如下

第二轮

第一次排序:19和33比较,19比33小,不用交换

第二次排序:33和62比较,33比62小,不用交换

第三次排序:62和8比较,62比8大,交换位置

第四次排序:62和18比较,62比18大,交换位置

第五次排序:62和75比较,62比75小,不用交换

第六次排序:75和29比较,75比29大,交换位置

由于第一轮已经将最大的数字移至最末端,所以最末端的数字就不参与比较

第二轮交换结束,最大的数是75,移动至倒二末端


第三轮排序如下

第三轮

第一次排序:19和33比较,19比33小,不用交换

第二次排序:33和8比较,33比8大,交换位置

第三次排序:33和18比较,33比18大,交换位置

第四次排序:33和62比较,33比62小,不用交换

第五次排序:62和29比较,62比29大,交换位置

第三轮交换结束,最大的数是62,移动至倒三末端


第四轮排序如下

第四轮

第一次排序:19和8比较,19比8大,交换位置

第二次排序:19和18比较,19比18大,交换位置

第三次排序:19和33比较,19比33小,不用交换

第四次排序:33和29比较,33比29大,交换位置

第四轮交换结束,最大的数是33,移动至倒四末端


第五轮排序如下

第五轮

第一次排序:8和18比较,8比18小,不用交换

第二次排序:18和19比较,18比19小,不用交换

第三次排序:19和29比较,19比29小,不用交换

第五轮交换结束,最大的数是29,移动至倒五末端


第六轮排序如下

第六轮

第一次排序:8和18比较,8比18小,不用交换

第二次排序:18和19比较,18比19小,不用交换

第六轮交换结束,最大的数是62,移动至倒六末端


第七轮排序如下

第七轮

第一次排序:8和18比较,8比18小,不用交换

第七轮交换结束,最大的数是62,移动至倒七末端


三、总结规律

1.首先比较的轮次是数组的长度-1 ,因为最后一轮只有一个数不用比较。

2.其次每一轮中需要排序的次数。第1轮比较7次,第二轮比较6次,以此类推,所以轮次是数组的长度-目前的轮次

3.每一轮里面做的事情是从前往后开始两两比较,如果右边的数比左边的数大那么左右进行交换


四、转化代码

从规律中我们很容易看出来这是双层for循环,外层控制比较的轮次,内层控制每轮的排序次数;

外层因为我们习惯i=0开始遍历,所以条件改为arr.length-1。满足比较的轮次是数组长度-1;

内层从0开始遍历,同理初始条件改为arr.length-1。由于还要减去目前的轮次,所以条件变为arr.length-1-i;

内层逻辑代码是当前面的数比后面的数大时,那么两两交换

public void sort() {
    int arr[] = {33,19,62,89,8,18,75,29};
    //循环的轮次是数组的长度-1
    //i循环从0开始,总共循环0,1,2,3,4,5,6 共7次
    for (int i = 0; i < arr.length-1; i++) {
        //j循环从0开始,第一轮循环7次,第二轮循环6次,以此类推到1次。
        for (int j = 0; j < arr.length-1-i j ifarrj>arr[j+1]){
                //那么两两交换
                int temp = arr[j];
                arr[j] = arr[j+1];
                arr[j+1] = temp;
            }
        }
        System.out.println(Arrays.toString(arr));
    }
}

以上就是本篇文章的全部内容了。

原文链接:,转发请注明来源!