基础算法笔记-冒泡排序

冒泡排序(Bubble Sort)

 之前大一的时候学的第一个排序就是冒泡排序,那时候用的是C语言,现在用java语言复习一下做个笔记,欢迎批评指点错误。


 作用:

  排序,就是将几个数从小到大或者从大到小的顺序排列。就像小学生排队回家一样(ps:小学生除了会排位,还是会排队的),他们可以从高的到矮的排队,也可以从矮到高的排队。冒泡排序算法就是把混乱的队排整齐的。

 思路:

   1、依次对相邻的两个数字对比,如果第一个前面的数字比后面的数字大,那么两个数字就交换,也就是将大的数字放在后面(这里拿从小到大的顺序排序)。比如:首先比较第1个数和第2个数,将这两个数中较大的放在第2个,较小的放在第1个;然后比较第2个和第2个数,将这两个数中较大的放在第3个,较小的放在第2个。

   2、这样一趟下来,要排序的数中最大的数就被放到了最后一个。

   3、第二趟还重复1中的步骤,但是不要比较最后一个(因为最后一个已经是最大的了,但是每次都比较所有的数也是可以的,但是效率就不高了,所以这样没必要,,,真的没必要。(!!-_-))。

  4、第三趟也是重复1中的步骤,但是不要比较最后两个了。。

  5、以此类推。

举例:

扫描二维码关注公众号,回复: 4149517 查看本文章

  1、假设有6个小朋友他们的身高分别为{6,3,2,1,5,4},我们用冒泡排序的方法对他们进行从矮到高的排队(下图每个方块代表一个小朋友,里面的数字代表他们的身高)。

    

    

//用java程序表示就是一个数组
int[] student= {6,3,2,1,5,4};

  2、第一排序:

         第一:我们首先对第1个和第2个小朋友身高进行比较,我们发现第1个小朋友比第2个小朋友高,所有就将第1个小朋友放到第2位去。

    

//用java表示就是一个for语句,其中用i=0的时候是第一轮排序,i=1时候是第二轮排序;而比较就是一个if的条件语句
for(int i=0;i<6;i++){

}

        

         第二:然后我们对上面排好的小朋友再比较,这次我们将第2个小朋友跟第3个小朋友比较,我们发现:第2个小朋友,明显比第3个小朋友高,所有我们又把他往后排(用代码表示就是一个if语句加上一个交换变量值的式子)。(甭管他愿不愿意,谁叫他长这么高的。)

                    

//用j表示每次循环中的对比次数,对此次数每轮都减少i个,因为每轮结束后当前最高的小朋友就被排到最后了,就不用管他了(规律是:第1轮减少0个,第二轮减少1个)
for(int i=0;i<6;i++){
    for(int j=1;j<6-i-1;j++) {
                
    }
}

        然后是第三比较,第四比较等等都是相同的。。。。。。。。。(整理一下第一的排序如下图)


         

        由图可知,我们第一轮就将长的最高的那位小朋友排到了最后。然后就不用管他了,因为他已经呆在了正确的位置了,接下来他只要看着前面五个小朋友被拉过来拉过去的排队就行了。

        图中的那个最高的小朋友是不是像水泡一样,从锅底,一步步的冒到了最上面(把第一位置想想成锅底,最后一个位置想想程最上面)

          接下来只要再进行4轮同样的对比和交换就可以将剩下的小朋友排好了


 代码实现:

public static void main(String[] args) {
        //用程序表示就是一个数组
        int[] student= {6,3,2,1,5,4};
        //用java表示就是一个for语句,其中用i=0的时候是第一轮排序,i=1时候是第二轮排序
        for(int i=0;i<6;i++) {
            //用j表示每次循环中的对比次数,对此次数每轮都减少i个,因为每轮结束后当前最高的小朋友就被排到最后了,就不用管他了(规律是:第1轮减少0个,第二轮减少1个)
            for(int j=0;j<6-i-1;j++) {
                //用下面的if语句进行对比,并进行交换
                int middle=0;
                if(student[j]>student[j+1]) {
                    //位置交换代码
                    middle=student[j];
                    student[j]=student[j+1];
                    student[j+1]=middle;
                }
            }
        }
        
    }

代码优化一下:

public class BubbleSort {
    public static void main(String[] args) {
        int[] student= {6,3,2,1,5,4,213,124,2};
        for(int i=1;i<6;i++) {
            for(int j=0;j<student.length-i;j++) {
                if(student[j]>student[j+1]) {
                    student[j]=student[j]+student[j+1];
                    student[j+1]=student[j]-student[j+1];
                    student[j]=student[j]-student[j+1];
                }
            }
        }
        for(int i=0;i<student.length;i++) {
            System.out.print(student[i]+"   ");
        }
    }
}

欢迎大佬给出建议。。。。

猜你喜欢

转载自www.cnblogs.com/Eastry/p/9986084.html