排序算法-冒泡排序

Posted 异次猿

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了排序算法-冒泡排序相关的知识,希望对你有一定的参考价值。

冒泡排序 

冒泡排序(Bubble Sort)是一种简单直观的排序算法;它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.走访数列的工作是重复地进行直到没有再需要交换(数列已经排序完成); 该算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端.

算法步骤

以从小到大排序的思路拆解算法步骤:

  • 比较相邻的两个元素,如果第一个比第二个大就交换位置.


  • 对每对相邻的元素进行比较,从开始第一队到结尾的最后一对,这样最后的元素就是最大的了.


  • 每循环一次之后都会有一个最大的数在后面,每确定一个最大的数,那个数在最后面不动它,这是内循环.


  • 每次循环确定最大得数沉到最底下,一共要循环数组的长度减一次,这是外循环.

算法复杂度

时间复杂度:O(n^2), 最优时间复杂度:O(n), 平均时间复杂度:O(n^2) 空间复杂度:O(1)

当输入的数据已经是正序时最快, 当输入的数据是反序时最慢

算法实现

冒泡排序元素从小到大排列的算法实现

 
   
   
 
  1. public static void bubble(int arr[]){

  2.    // 外循环,需要循环的次数

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

  4.        // 内循环,用于相邻位置上的数据比较, 每次循环都能确定一个最大数在最后

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

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

  7.                int tmp = arr[j];

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

  9.                arr[j + 1] = tmp;

  10.            }

  11.        }

  12.    }

  13. }

冒泡排序还有一种 优化算法,就是立一个flag,当在一趟序列遍历中元素没有发生交换,则证明该序列已经有序.

 
   
   
 
  1. public static void bubble(int arr[]){

  2.    // 外循环,需要循环的次数

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

  4.        boolean flag = true;

  5.        // 内循环,用于相邻位置上的数据比较,每次循环都能确定一个最大数在最后

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

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

  8.                int tmp = arr[j];

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

  10.                arr[j + 1] = tmp;

  11.                flag = false;

  12.            }

  13.        }

  14.        // 在一趟遍历中元素没有发生交换则,说明序列已经有序

  15.        if (flag) {

  16.            break;

  17.        }

  18.    }

  19. }

数据示例

初始序列:95 27 90 49 80 58 6 9 18 50

 
   
   
 
  1. 1趟:  [6] 95 27 90 49 80 58 9 18 50

  2. 2趟:  [6 9] 95 27 90 49 80 58 18 50

  3. 3趟:  [6 9 18] 95 27 90 49 80 58 50

  4. 4趟:  [6 9 18 27] 95 90 49 80 58 50  

  5. 5趟:  [6 9 18 27 49] 95 90 80 58 50  

  6. 6趟:  [6 9 18 27 49 50] 95 90 80 58  

  7. 7趟:  [6 9 18 27 49 50 58] 95 90 80  

  8. 8趟:  [6 9 18 27 49 50 58 80] 95 90    

  9. 9趟:  [6 9 18 27 49 50 58 80 90] 95    

  10. 果:  [6 9 18 27 49 50 58 80 90 95]    




以上是关于排序算法-冒泡排序的主要内容,如果未能解决你的问题,请参考以下文章

排序算法之冒泡选择插入排序(Java)

排序算法_冒泡排序(算法设计与C代码实现)

三大基础排序算法(冒泡排序,选择排序,插入排序)

交换排序(冒泡排序快速排序的算法思想及代码实现)

冒泡排序

冒泡排序算法原理和代码实现,就是这么简单。。。