1. 选择排序
1.1 原理
- 确定索引
i
位置, - 然后把
i
和i+1~N-1
逐个比较找到最小索引位置minIndex
- 最后
i
和minIndex
位置元素互换
1.2 代码
public class Code01_SelectionSort {
public static void selectionSort(int[] arr) {
if (arr == null || arr.length < 2) {
return;
}
for (int i = 0; i < arr.length - 1; i++) { // 确定索引i位置
int minIndex = i;
for (int j = i + 1; j < arr.length; j++) {
minIndex = arr[minIndex] > arr[j] ? j : minIndex; // 找到最小索引位置 minIndex
}
swap(arr, i, minIndex);
}
}
public static void swap(int[] arr, int i, int j) {
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
1.3 时间复杂度O(n)
0位置 比较n-1次
1位置 比较n-2次
2位置 比较n-3次
····
n-2位置 比较1次
n-1位置 比较0次
(n-1) + (n-2) + (n-3) + 0 = n(n-1) / 2 = O( n 2 n^2 n2)
2. 冒泡排序
2.1 原理
- 从后往前遍历
- 最后面的位置
end
- 数组索引
0到end
两两比较交换
2.2 代码
public class Code02_BubbleSort {
public static void main(String[] args) {
int[] arr = {5, 4, 3, 2, 1};
bubbleSort(arr);
for (int x : arr) {
System.out.print(x);
System.out.print(" ");
}
}
public static void bubbleSort(int[] arr) {
if (arr == null || arr.length < 2) {
return;
}
for (int e = arr.length - 1; e > 0; e--) {
// 最后的索引位置 从后往前遍历
for (int i = 0; i < e; i++) {
// 0 到 end 两两比较交换
if (arr[i] > arr[i + 1]) {
swap(arr, i, i + 1);
}
}
}
}
public static void swap(int[] arr, int i, int j) {
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
2.3 时间复杂度O(n)
end索引 n-1 位置 比较 n-1 次
end索引 n-2 位置 比较 n-2 次
end索引 n-3 位置 比较 n-3 次
···
end索引 3 位置 比较 3 次
end索引 2 位置 比较 2 次
end索引 1 位置 比较 1 次
(n-1) + (n-2) + (n-3) + 0 = n(n-1) / 2 = O( n 2 n^2 n2)