冒泡排序(Bubble Sort)-Java版

算法简述

  冒泡排序(Bubble Sort),是一种计算机科学领域的较简单的排序算法。
  它重复地走访过要排序的元素列,依次比较两个相邻的元素,如果顺序(如从大到小、首字母从Z到A)错误就把他们交换过来。走访元素的工作是重复地进行直到没有相邻元素需要交换,也就是说该元素列已经排序完成。
  这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端(升序或降序排列),就如同碳酸饮料中二氧化碳的气泡最终会上浮到顶端一样,故名“冒泡排序”。

 

算法原理

  1. 比较相邻的元素。如果第一个比第二个大,就交换他们两个。
  2. 对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
  3. 针对所有的元素重复以上的步骤,除了最后一个。
  4. 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

 

冒泡排序

 

代码实例

 1 package sort;
 2 
 3 public class BubbleSortDemo {
 4     /**
 5      *
 6      * 时间复杂度 : O(n^2)
 7      * @description 冒泡排序
 8      * @param arr 需要排序的数组
 9      * @author PangDongLin
10      *
11      */
12     public static void bubbleSort(int[] arr) {
13         int temp = 0;
14         for (int i = 0; i < arr.length - 1; i++) {
15             for (int j = 0; j < arr.length - 1 - i; j++) {
16                 if (arr[j] > arr[j + 1]) {
17                     temp = arr[j];
18                     arr[j] = arr[j + 1];
19                     arr[j + 1] = temp;
20                 }
21             }
22         }
23     }
24 
25     public static void main(String[] args) {
26         int[] arr = {3, 9, 33, 10, 2,-1};
27         bubbleSort(arr);
28         for (int i = 0; i < arr.length; i++) {
29             System.out.println(arr[i]);
30         }
31     }
32 }

 

算法优化

  以上代码为冒泡排序的常规实现,但是常规实现是有缺点的,具体缺点如下

    1. 每一趟比较都要比较到数组的最后,没有必要,只要比较到无序数列即可

    2. 不管是否有序,都要进行N-1趟循环

  那么如何判断有序?比较了一趟,没有发生交换,就是有序

    定义一个boolean类型的变量flag,默认有序true;发生交换,置为false,一趟循环结束后,根据flag的值判断是否有序,有序,则退出循环

 

代码优化实例

 1 package sort;
 2 
 3 public class BubbleSortDemo {
 4     /**
 5      *
 6      * 冒泡排序的优化版
 7      * @param arr
 8      * @author PangDongLin
 9      */
10     public static void bubbleSort1(int[] arr) {
11         int temp = 0;
12         boolean flag = false; //表示变量,表示是否进行过交换
13         for (int i = 0; i < arr.length - 1; i++) {
14             for (int j = 0; j < arr.length - 1 - i; j++) {
15                 if (arr[j] > arr[j + 1]) {
16                     flag = true;
17                     temp = arr[j];
18                     arr[j] = arr[j + 1];
19                     arr[j + 1] = temp;
20                 }
21             }
22             if (!flag) {
23                 break; //在一轮排序中,一次都没交换过
24             } else {
25                 flag = false; // 重置flag,进行下次判断
26             }
27         }
28     }
29     public static void main(String[] args) {
30         int[] arr = {3, 9, 33, 10, 2, -1};
31         bubbleSort1(arr);
32         for (int i = 0; i < arr.length; i++) {
33             System.out.println(arr[i]);
34         }
35     }
36 }

 

  

  

posted @ 2020-10-12 16:39  -奔跑的蘑菇-  阅读(179)  评论(0)    收藏  举报