天天看點

冒泡排序

在氣泡從水底冒起的過程中,氣泡的體積是不斷增大的。冒泡排序的基本原理也是如此,在排序過程中,數值大的值會向後移動。

一.分析

1-1 原理

如果待排序的非升序序列的長度為n,在整個冒泡排序過程中,總共會進行n-1趟排序,每趟排序都會從還未排序的序列排出一個最大的數。

冒泡排序

如果待排序的序列是升序序列,則隻會進行1趟排序,在第1趟排序時判斷出待排序的序列是升序的,在2趟排序時直接傳回。

1-2 時間複雜度

最好情況:T(n) = O(n) 即是待排序序列已經為升序的情況

最壞情況:T(n) = O(n2)

平均情況:T(n) = O(n2)

二.代碼實作

1     /**
 2      * 冒泡排序
 3      * @param nums 待排序的序列
 4      *
 5      * @author Hutao
 6      * @since 2.7.0
 7      * @date 2021/2/15 21:52
 8      */
 9     public static void bubbleSort(int[] nums){
10         if(null==nums||nums.length<=1){
11             return;
12         }
13 
14         //辨別待排序序列是否為有序序列的辨別
15         boolean inOrder = true;
16 
17         for (int i = 0; i < nums.length - 1; ++i) {
18             //在第二趟排序時,如果待排序的序列已經為有序(升序),就無需再排序
19             if (i >= 1 && inOrder) {
20                 return;
21             }
22 
23             for (int j = 0; j < nums.length - 1 - i; ++j) {
24                 if (nums[j] > nums[j + 1]) {
25                     //第一趟确定待排序的序列是否已經為有序序列(升序)
26                     if(0==i){
27                         inOrder = false;
28                     }
29                     int temp = nums[j];
30                     nums[j] = nums[j + 1];
31                     nums[j + 1] = temp;
32                 }
33             }
34         }
35 
36     }      
參考源:https://blog.csdn.net/weixin_41190227/article/details/86600821?spm=1001.2014.3001.5506