目錄
很多小夥伴對冒泡排序和選擇排序傻傻分不清楚,今天我把這兩個排序放在一起,希望能幫助大家更好的理解它們!
一、冒泡排序:
1、排序原理
從左到右,數組中相鄰的兩個元素進行比較,將較大的放到後面。
2、原理圖
例如:int [] a = {3,7,6,4,2};
第一輪排序:比較了4次,本輪排序結束後數組變成了{3,6,4,2,7},如下圖:
第二輪排序:比較了3次,本輪排序結束後數組變成了{3,4,2,6,7},如下圖:
以此類推...
3、代碼實現
根據上圖規律,實現如下代碼,即是冒泡排序法:
/**
* 冒泡排序
* N個數字冒泡排序,總共要進行N-1輪比較,每輪的排序次數爲(N-i)次比較
*
* @author 百里慕溪
*/
public static void bubbleSort(int[] array) {
// 一定要記住判斷邊界條件,很多人不注意這些細節
if (array == null || array.length < 2) {
return;
}
// 需要進行array.length輪比較
for (int i = 0; i < array.length - 1; i++) {
// 第i輪比較
for (int j = 0; j < array.length - i - 1; j++) {
// 開始進行比較,如果array[j]比array[j+1]的值大,那就交換位置
if (array[j] > array[j + 1]) {
int temp = array[j];
array[j] = array[j + 1];
array[j + 1] = temp;
}
}
}
}
運行結果:
二、選擇排序
1、排序原理
第n次循環拿數組中第n個位置上的值和該位置以後的所有元素中最小的比較,如果第n個位置上的值比後面的最小的值大,那就和最小的值換位。
2、原理圖
第一輪排序:比較4次,本輪排序結束數組變成了{2, 7, 6, 4, 3},如下圖:
第二輪排序:比較了3次,本輪排序結束後數組變成了{2,3,6,4,7},如下圖:
以此類推...
3、代碼實現
/**
* 選擇排序
*
* @author 百里慕溪
*/
public static void selectSort(int[] array) {
// 一定要記住判斷邊界條件,很多人不注意這些細節
if (array == null || array.length < 2) {
return;
}
// 數組比較次數n-1
for (int i = 0; i < array.length - 1; i++) {
int min = i;// 保存當前最小元素的位置
// 遍歷待排序數組元素(i之後的元素)
for (int j = i + 1; j < array.length; j++) {
// 如果已排序中較大元素大於待排序元素中的最小元素,則更換元素對應索引
if (array[min] > array[j]) {
min = j;
}
// 確保找出待排序的最小元素的編號
}
// 置換位置
int temp = array[min];
array[min] = array[i];
array[i] = temp;
}
}
運行結果:
三、兩者區別
(1)冒泡排序是比較相鄰位置的兩個數,而選擇排序是按順序比較,找最大值或者最小值;
(2)冒泡排序每一輪比較後,位置不對都需要換位置,選擇排序每一輪比較都只需要換一次位置;
(3)冒泡排序是通過數去找位置,選擇排序是給定位置去找數;
冒泡排序優缺點:
優點:比較簡單,空間複雜度較低,是穩定的;
缺點:時間複雜度太高,效率慢。
選擇排序優缺點:
優點:一輪比較只需要換一次位置;
缺點:效率慢,不穩定。
JAVA基礎篇專欄持續更新中,更多JAVA基礎知識請移步專欄垂閱,希望對您有幫助!