我們在學習排序算法的時候或許很多人接觸到的都是冒泡和選擇這兩種排序算法,其實真的可以說的是這兩種算法確實是比較經典的排序方法,同時,在我的理解中,這兩個排序具有驚奇的相似點。何為冒泡排序,如果我們在家煮過水都能知道,在水即將沸騰的時候會有一個又一個的水泡往上冒,這個現象其實和冒泡排序還是比較相似的,今天我們來講一下這個冒泡。我們看下邊的這幅圖進行理解一下

我們可以發現所謂的冒泡其實就是使用相鄰的兩個數據進行比較,然后交換數據,讓你的第二個數據始終是兩個數據中最大的數據,這樣我們進行N-1次循環就會達到我們想要的效果。話不多說直接上代碼:
public static void bubbleSort(int arr[]){ //外層循環控制需要排序的次數 for(int i = 0; i < arr.length -1;i++){ //里層循環控制比較的數據 for(int j = 0;j < arr.length - 1 - i;j++){ //取出兩個數據進行比較,並進行數據的判斷交換 if(arr[j] > arr[j+1]){ int k = arr[i]; arr[i] = arr[j]; arr[j] = k; } } } }
在這里我們還是會發現一些細節的地方,比如在我的里層循環中為什么出現-1這樣奇怪的數據,又是為什么我要-i這樣做是為什么。首先我們可以看到在取出兩個相鄰數據進行比較的時候我們選取的是從零開始,然后在和它的后一個數據進行比較,那么我們可以想象,在最后一個數據,arr.length-1的時候,如果我們依然使用下一個數據arr.length會不會造成數組下標越界,所以這就是我們需要-2的原因。我們又是為什么會-i呢,我們想一下,我們在經歷過i次排序之后,是不是默認為最后的i個數據已經是有序的了,那么我們還需要對其中的數據進行比較么,答案很明顯是不需要,所以為了優化一下排序,我們-i。當然在這里探討的問題是可不可以換一種寫法,不用考慮這個數組下標越界的情況,答案是當然可以,代碼如下:
public static void bubbleSort(int arr[]){ for(int i = 0; i < arr.length -1;i++){ for(int j = 1; j < arr.length - i;j++){ if(arr[j - 1]>arr[j]){ int key = arr[j-1]; arr[j - 1] = arr[j]; arr[j] = key; } } } }
我們可以看到這段代碼和上一段的區別就是從1開始,然后選取上一個數據和它進行比較,這樣我們就可以完全避免數組下標越界的情況產生,如果還不理解可以畫圖思考一下。
