冒泡排序(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 }

浙公网安备 33010602011771号