交換類排序主要是通過兩兩比較待排元素的關鍵字,若發現與排序要求相逆,則“交換”之。在這類排序方法中最常見的是冒泡排序和快速排序。簡單寫一寫冒泡排序。
冒泡排序的思想
首先,將 n 個元素中的第一個元素和第二個元素進行比較,如果兩個元素的位置爲逆序,則交換兩個元素的位置;進而比較第二個和第三個元素關鍵字,如此類推,直到比較第 n-1 個元素和第 n 個元素爲止;上述過程描述了冒泡排序的第一趟排序過程,在第一趟排序過程中,我們將關鍵字最大的元素通過交換操作放到了具有 n 個元素的序列的最後一個位置上。然後進行第二趟排序,在第二趟排序過程中對元素序列的前 n-1 個元素進行相同操作,其結果是將關鍵字次大的元素通過交換放到第 n-1 個位置上。一般來說,第 i (i>=1)趟排序是對元素序列的前 n-i+1 個元素進行排序,使得前 n-i+1 個元素中關鍵字最大的元素被放置到第 n-i+1 個位置上。排序共進行 n-1 趟,即可使得元素序列按關鍵字有序。
代碼實現
public class BubbleSortTest {
public static void main(String[] args) {
Integer[] arr = {5,2,7,3,9,10,8,6,1,4};
bubbleSort(arr);
System.out.println(Arrays.toString(arr));
}
public static void bubbleSort(Integer[] arr){
//假設從小到大排序
//此標誌是:如果在第一趟排序時沒有交換任何元素位置,那麼就說明該數組是有序的。
boolean flag = false;
//外層循環是第幾趟排序過程,最後只剩一個元素的時候就不需要比較了。
//所以,對於長度爲n的數組,需要進行n-1趟排序
for (int i = 1; i < arr.length; i++) {
//在每一趟排序後,數組右側有序區逐漸變大,在第i趟排序要對數組的前n-i+1個元素進行排序,
//第n-i+1個元素的索引是n-i,同時,需要保證j+1<=n-i
for (int j = 0; j < arr.length-i; j++) {
if (arr[j] > arr[j+1]) {
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
flag = true;
}
}
if(!flag) {break;}
}
}
}
如果還是不理解這兩個for循環i和j的取值範圍,可以自己在紙上畫一畫。
空間效率
僅使用一個輔助存儲單元。
時間效率
冒泡排序的時間複雜度爲Ο(n2)【n的平方】。