1、选择排序算法
选择排序算法的核心思想是 从剩下的数组中选择最小的元素,然后和数组头部的元素交换,然后重复操作,根据其最多的操作次数,可以计算其时间复杂度为
- 从数组中选择最小的元素
- 将最小的元素和数组的第1位元素交换
- 从剩下的元素中找到最小的元素
- 将最小的元素和第2位元素交换
- 从生效的元素中找到最小的元素
- 将最小的元素和第3位元素交换
- 重复上述流程,直到遍历完毕

*** 选择排序法** @apiNote 时间复杂度: O(n + (n-1) + ... + 1) = O(n^2)*/public class ChooseSort {public static void main(String[] args) {Integer[] numbers = ArrayUtils.generatorRandomArray(10, 100);sort(numbers);// 断言数组是升序的assert SortUtils.isSorted(0, numbers);}private static void sort(Integer[] numbers) {for (int i = 0; i < numbers.length; i++) {// 省略,从 i开始到数组结尾知道最小元素的索引Integer minIndex = findMin(i, numbers);// 省略,交换数组中的i和j的元素数据swap(i, minIndex, numbers);}}}
2、插入排序算法
插入排序的核心思想是从数组第二位开始,依次遍历将数据插入到前面的有序数组中,其执行的次数为 其动画演示如下:

/**
* 插入排序法
*
* @apiNote 时间复杂度: O(n + (n-1) + (n-2) + ... + 1) = O(n^2)
*/
public class InsertSort {
public static void main(String[] args) {
Integer[] numbers = ArrayUtils.generatorRandomArray(10, 100);
sort(numbers);
// 断言数组是升序的
assert SortUtils.isSorted(0, numbers);
}
private static void sort(Integer[] numbers) {
int sortedIndex = 0;
for (int i = 1; i < numbers.length; i++) {
if (numbers[i] < numbers[sortedIndex]) {
for (int tmp = i, j = sortedIndex; j >= 0; j--) {
if (numbers[tmp] < numbers[tmp - 1]) {
// 交换第tmp和tmp--位置的数据
swap(tmp, --tmp, numbers);
} else {
break;
}
}
}
sortedIndex++;
}
}
}
