代码改变世界

冒泡排序(Bubble Sort)

2018-09-15 16:49  简简单单1111  阅读(442)  评论(0编辑  收藏  举报

冒泡排序算法通过多次比较交换来实现排序,其排序流程如下:

       1、对数组中的数据,从前往后依次比较相邻的两个数的大小,小数放前,大数放后。

       2、即首先比较第1个数和第2个数比较,小数放前,大数房后。然后比较第2个数和第3个数,将小数放前,大数放后,直至比较到最后两个数,重复此步骤,直至所有数据比较完成。

       3、第一趟比较完成后,最后一个数一定是数组中最大的一个,所以第二趟排序比较的时候最后一个数不参与比较。

       4、第二趟比较完成后,倒数第二个数也一定是数组中的第二大的数,所以第三趟排序的时候最后两个数不参与比较。

       5、依次类推,每一趟比较次数-1 。

       6、冒泡排序可以从前往后比较,也可以从后往前比较。

       7、对于n个数据的数组排序,需要进行n-1次排序。

       举例1:要排序的数组   int  arr={118 ,101 ,105 ,127, 112};       

        第一趟排序:
                                  第一次比较 :118>101,交换位置:101,118,105,127,112;
                            第二次比较 :118>105,交换位置:101,105,118,127,112;
                            第三次比较 :118<127,不交换位置:101,105,118,127,112;
                            第四次比较 :127>112,交换位置:101,105,118,112,127。(127一定是数组中最大的数,下次排序不需要比较)

       第二趟排序 :
                             第一次比较 :101<105,不交换位置:101,105,118,112,127;
                             第二次比较 :105<118,不交换位置:101,105,118,112,127;
                             第三次比较 :118>112,交换位置:101,105,112,118,127;(118是数组的第二大的数,下次排序不需要比较)

          第三趟排序:

                             第一次比较:101<105,不交换位置:101,105,112,118,127;

                             第二次比较:105<112,不交换位置:101,105,112,118,127;(112是数组的第三大的数,下次排序不需要比较)

        第四趟排序:

                             第一次比较:101<105,不交换位置:101,105,112,118,127;

                             前三趟排序已经排好前三大的数(127,118,112),第四次排序只需要比较一次,就可以确定最终的排序。

       举例2: 要排序的数组  int arr1={9,7,3,1},即需要进行三次排序:

        第一趟排序:

                      第一次比较:9>7,交换位置:7,9,3,1;

                      第二次比较:9>3,交换位置:7,3,9,1;

                      第三次比较:9>1,交换位置:7,3,1,9;(9是最大的数,下次排序不需要比较)

        第二趟排序:

                       第一次比较:7>3,交换位置:3,7,1,9;

                       第二次比较:7>1,交换位置:3,1,7,9;(7是第2大的数,下次排序不需要比较)

        第三趟排序:

                        第一次比较:3>1,交换位置:1,3,7,9;(最终的排序)

 

       冒泡排序的过程可以形象的类似于水泡的浮起过程,故因此得名。冒泡排序在进行N个数据的进行排序时,无论原始的数据有无顺序,
都需要进行N-1步的中间排序,这种排序方法简单直观,但是缺点是执行的步骤有点长,效率不是很高。

       N个数字进行排序的时候,需要进行N-1趟排序,每趟排序的次数为N-i次,所以外层控制循环多少趟,内层控制每一趟的循环次数。

代码示例为Eg03
public static void main(String[] args) {
                                 int [] aaa={118,101,105,127,112};
                                 System.out.println("冒泡排序之前的数组为:");
                                    for (int a : aaa) {
                                                  System.out.print(a+" ");
                                     }
                                       

             //外层循环控制排序趟数

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

                                         for (int j = 0; j < aaa.length-i; j++) {
                                                   if(aaa[j]>aaa[j+1])
                                         {
                                                   int temp=aaa[j+1];
                                                   aaa[j+1]=aaa[j];
                                                   aaa[j]=temp;
                                         }
                               }
                                  System.out.println();
                                  System.out.println("第"+i+"次冒泡排序结果为:");
                                   for (int b : aaa) {
                                          System.out.print(b+" ");
                                        }
                          }
           }