1. 什么是排序问题
排序是让一组无序数据变成有序的过程。
衡量一个排序算法的优劣,我们主要会从以下 3 个角度进行分析:
- 时间复杂度,具体包括,最好时间复杂度、最坏时间复杂度以及平均时间复杂度。
- 空间复杂度,如果空间复杂度为 1,也叫作原地排序。
- 稳定性,排序的稳定性是指相等的数据对象,在排序之后,顺序是否能保证不变。
2. 常见的4种排序算法及其思想
接下来,开始详细地介绍一些常见的4种排序算法及其思想
2.1 冒泡排序
2.1.1冒泡排序的原理
从第一个数据开始,依次比较相邻元素的大小。如果前者大于后者,则进行交换操作,把大的元素往后交换。通过多轮迭代,直到没有交换操作为止。
2.1.2冒泡排序的性能
- 时间复杂度:最好时间复杂度是 O(n);最坏时间复杂度是 O(n*n);平均时间复杂度是 O(n *n)。
- 空间复杂度: O(1)
- 稳定性:稳定
代码如下:
public static void main(String[] args) {
int[] arr = {
1, 0, 3, 4, 5, -6, 7, 8, 9, 10 };
System.out.println("原始数据: " + Arrays.toString(arr));
for (int i = 1; i < arr.length; 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;
}
}
}
System.out.println("冒泡排序: " + Arrays.toString(arr));
}
2.2 插入排序
2.2.1 插入排序的原理
选取未排序的元素,插入到已排序区间的合适位置,直到未排序区间为空。 插入排序顾名思义,就是从左到右维护一个已经排好序的序列。直到所有的待排数据全都完成插入的动作。
2.2.2 插入排序的性能
- 时间复杂度:最好时间复杂度是 O(n);最坏时间复杂度是 O(n*n);平均时间复杂度是 O(n *n)。
- 空间复杂度: O(1)
- 稳定性:稳定
代码如下:
public static void main(String[] args) {
int[] arr = {
2, 3, 5, 1, 23, 6, 78, 34 };
System.out.println("原始数据: " + Arrays.toString(arr));
for (