欢迎光临散文网 会员登陆 & 注册

冒泡排序

2022-11-11 14:41 作者:酸奶公园  | 我要投稿


冒泡排序(Bubble Sort)的基本思想是:通过对排序序列从前向后(从下标较小的元素开始)依次比较相邻元素的值,若发现逆序则交换,使得值比较大的元素逐渐从前向后移动,就像水底下的气泡一样逐渐向上冒。

假设排升序:

将数组中相邻元素从前往后依次进行比较,如果前一个元素比后一个元素大,则交换,一趟下来后最大元素就在数组的末尾。

依次从上上述过程,直到数组中所有的元素都排列好。

依据这个思想,我们很容易写出如下代码:

package shujvjiegou;

//欢迎来到酸奶公园

//最好自己先思考一下,不然很快忘记的。代码问题尽管q我3095563063知无不言

public class maopaopaixu {

    public static void main(String []args) {

int[] arr = {10,5,3,7,6};

System.out.println("arr的排序前:\n10  5  3  7  6");

int temp  = 0 ;

for(int i = 0 ;i< arr.length -1; i++){

for(int j = 0; j<arr.length-1-i; j++){

if(arr[j]>arr[j+1]){

temp = arr[j];

arr[j] = arr[j+1];

arr[j+1] = temp;

}

}

}

System.out.println("arr排序后:");

        for(int i = 0; i<arr.length; i++){

 

System.out.print(arr[i]+"\t");

}

      

    }

}

代码实现过程:

 上述代码在我们思路清晰的情况下很容易写出,但是代码是如何实现的呢?

在这里我们主要关注两个点:趟数i和每次循环的次数j。

第1趟:i = 0时

        当j = 0时,此时array[0] = 10; array[1] = 5;10 > 5,所以执行array[j] = array[j+1]的交换代码(这里交换代码简写,下同),数组变为:{5,10,3,7,6};


        当j = 1时,此时array[1] = 10; array[2] = 3;10 > 3,所以执行array[j] = array[j+1]的交换代码,数组变为{5,3,10,7,6};


        当j = 2时,此时array[2] = 10; array[3] = 7;10>7,所以执行array[j] = array[j+1]的交换代码,数组变为{5,3,7,10,6};


        当j = 3时,此时array[3] = 10; array[4] = 6;10>6,所以执行array[j] = array[j+1]的交换代码,数组变为{5,3,7,6,10};


        至此第1趟的内部循环结束,我们将10这个数字排列到数组的末尾,此时j循环了4次,j = 3时停止。


        我们发现,数组中一共有5个元素,j循环了4次,那么第一个循环条件就是j <array.length - 1;如果不-1的话,j = 4的时候,那么array[j+1]就会越界,因为数组的下标就到4。 所以array.length - 1,是否就有一个条件呢?,答案是否定的(可以做代码优化),我们继续向下执行第2趟。




 第2趟:i = 1时

        当j = 0时,此时数组是上一趟结束的数组{5,3,7,6,10},此时array[0] = 5; array[1] = 3;5 > 3,所以执行array[j] = array[j+1]的交换代码,数组变为:{3,5,7,6,10};


        当j = 1时,此时array[1] = 5; array[2] = 7;5 < 7,所以不执行array[j] = array[j+1]的交换代码,数组还是{3,5,7,6,10};


        当j = 2时,此时array[2] = 7; array[3] = 6;7 > 6,所以执行array[j] = array[j+1]的交换代码,数组变为{3,5,6,7,10};


        至此第2趟代码就执行完交换了,因为当j = 3的时候,我们比较的是7和10的大小,在第一趟的时候,我们就已经操作完10到数组的末尾了,所以没必要再比较一次。


         在第2趟中我们将7操作到倒数第二位的指定位置,我们发现内部循环j执行了3次,到j = 2时候停止。 其实到第2趟的时候我们已经排序完成了,但是代码不知道这个事情(这点记下来,可以做代码优化),我们接着执行第3趟




 第3趟:i = 2时

        当j = 0时,此时数组是上一趟结束的数组{3,5,6,7,10},此时array[0] = 3; array[1] = 5;3 < 5,所以不执行array[j] = array[j+1]的交换代码,数组还是{3,5,6,7,10}。


         当j = 1时,此时array[1] = 5; array[2] = 6;5 < 6,所以不执行array[j] = array[j+1]的交换代码,数组还是{3,5,6,7,10}。


         至此第3趟的内部循环就结束了,因为如果再往下执行,就要操作7了,但是7我们在第2趟的时候已经操作过了。


         在第3趟的内部循环中,是操作了6在倒数第3位的位置,我们发现内部循环j执行了2次,到j = 1时候停止。 数据早就排序好了,但是代码不知道,所以继续第4趟。




第4趟,i = 3时

        当j = 0时,此时数组是上一趟结束的数组{3,5,6,7,10},此时array[0] = 3; array[1] = 5;3 < 5,所以不执行array[j] = array[j+1]的交换代码,数组还是{3,5,6,7,10}。


        至此第4趟结束了,因为我们要操作的是5这个数字,和3比较完之后,就已经在原来正确的位置了,所以循环结束。


        在第4趟的内部循环中,是操作了5在倒数第4位的位置,我们发现内部循环j执行了1次,到j = 0时候停止。


         


冒泡排序的评论 (共 条)

分享到微博请遵守国家法律