1. 程式人生 > >Java基礎系列--冒泡排序

Java基礎系列--冒泡排序

editor hle 快速排序算法 了解 HR 容易 div 方式 發現

原創作品,可以轉載,但是請標註出處地址:https://www.cnblogs.com/V1haoge/p/9064218.html

1、算法簡介

  冒牌排序是很耳熟的排序方式,雖然它使用的很少,但是經常會出現在面試中,冒泡的意思是漸進式的意思,即漸進式排序。

2、算法原理

  冒泡排序就是通過相鄰元素的兩兩比較交換的方式實現排序,每次比較的兩個元素中都包含上一次比較的後一位元素,也就是每次比較替換之間都是存在關聯的,那個關聯的元素一步步向後移,就好比冒泡一般,直到水面(排好序)。

  每次冒泡的結束都意味著一個元素的歸位,即一個元素被排好序,一般我們都是采用向後冒泡的方式來實現排序的,那麽也就意味著,元素歸位的順序是從尾部開始的。

  而每次冒泡又都是從首位元素開始的,到未被排序的最後一位結束。那麽也就意味著每次冒泡的比較次數要比上一次冒泡少1次,因為每結束一次冒泡就會在末尾完成一個元素的排序,而未排序的元素相應的就會少一位。

  了解上面的這些,這有利於我們實現編程算法,但初學者必定是一頭霧水,不要急,你需要在參考下面實現源碼的基礎上再理解上面的內容,那麽你會加深理解。

3、算法實現

 1 public class BubbleSort {
 2 
 3     public static void main(String[] args) {
 4         int[] ints = {2, 6, 4, 9, 12, 98, 5, 32, 90, 33, 24, 65, 37, 12, 4};
5 sort(ints); 6 } 7 8 public static void sort(int[] ints){ 9 for(int i = ints.length - 1; i > 0; i--) { 10 for(int j = 0; j < i; j++) { 11 if(ints[j] > ints[j + 1]){ 12 int temp = ints[j]; 13 ints[j] = ints[j + 1];
14 ints[j + 1] = temp; 15 } 16 } 17 } 18 for(int i : ints) { 19 System.out.print(i + " "); 20 } 21 } 22 }

4、算法解析

  從上面的代碼中我們進行原理的解析,這樣可以加深對原理的理解,我們學習算法並不是為了背誦這麽一段簡單的代碼,我們學的是原理,是思維,雖然我也無法完全做到,但努力中,因為在我們完全理解了其原理之後,代碼實現起來就會相當相當的容易,再也不用去背代碼。

  冒泡排序的實現代碼中第9行為外層循環,用於控制冒泡的次數,正如原理中所說,冒泡排序是從尾部開始的,所以我們的循環變量i從尾部開始循環,末尾元素下標即為ints.length-1,i的變化範圍為i>0,這裏不包含0 的原因是因為當我們把序列的ints.length-1個元素排好序之後,只剩余一位元素,那麽這一位元素自動就已經排好序了,無需再次冒泡,若為從小到大排序,那麽最後剩余的元素就是首位元素,它即為最小的元素,不用再次執行冒泡排序。那麽我們就得知外層循環控制的冒泡的次數為序列的長度減1次。

  第10行的內容為內層循環,由於每次冒泡我們都是從首位元素開始,慢慢右移到末位(這裏的末位並非末尾),一次冒泡是由有數次的兩兩比較交換(第11到14行代碼)實現的,所以我們的代碼中內循環變量j=0,表示每次都是從0下標元素開始冒泡,j的變化範圍為j <i,這裏是我們的重點,是內外層循環的關聯點,我們每次冒泡比較的次數都是不同的,細心點就會發現,每次次數都會少一次,這個邏輯的控制就在這裏,j小於i,而i在每次冒泡開始前都會執行i--,正好實現了我們的目的,而正因如此,我們每次冒泡結束的時候並不是末尾,而是未排序元素末位,這個末位會隨著冒泡逐次前移,每次一位,直到第二位進行末次冒泡進而完成排序。

  忘了說一點,這裏j<i,為什麽不是i-1,或者i+1呢?因為在我們每次冒泡的最後一次比較中,都是末位和末位前的兩位元素比較,然後就結束了,並不是比較剩余未排序元素個數次,而是個數減1次,這裏j<i,正好就是減1次。

  冒泡排序的精髓就在這兩層循環之內,完全理解其意之後,實現起來就很簡單了。

4.1、時間復雜度

  冒泡排序外層循環執行次數為n-1次,這裏n代表序列元素個數,內循環次數為n(n-1)/2次,冒泡排序算法的時間復雜度為O(n2)。

4.2、空間復雜度

  冒泡排序算法中會用到臨時空間用於元素交換,通過優化,我們可以實現,空間復雜度為O(1)。

5、總結

  冒泡排序現在更多的是出現在一些面試題裏面,用於查看面試者的只是擴展度,實際使用中很少用到了,因為這種算法的時間復雜度還是不如人意。現在使用較多的還是快速排序算法。

  

  

Java基礎系列--冒泡排序