排序算法
排序算法
常见的排序算法
| 排序算法 | 时间复杂度(平均) | 时间复杂度(最好) | 时间复杂度(最坏) | 空间复杂度 | 稳定性 |
|---|---|---|---|---|---|
| 冒泡排序(Bubble Sort) | O(n^2) | O(n) | O(n^2) | O(1) | 稳定 |
| 选择排序(Selection Sort) | O(n^2) | O(n^2) | O(n^2) | O(1) | 不稳定 |
| 插入排序(Insertion Sort) | O(n^2) | O(n) | O(n^2) | O(1) | 稳定 |
| 希尔排序(Shell Sort) | O(n log n) | O(n) | O(n^2) | O(1) | 不稳定 |
| 归并排序(Merge Sort) | O(n log n) | O(n log n) | O(n log n) | O(n) | 稳定 |
| 快速排序(Quick Sort) | O(n log n) | O(n log n) | O(n^2) | O(n log n) | 不稳定 |
| 堆排序(Heap Sort) | O(n log n) | O(n log n) | O(n log n) | O(1) | 不稳定 |
| 计数排序(Counting Sort) | O(n+k) | O(n+k) | O(n+k) | O(k) | 稳定 |
| 桶排序(Bucket Sort) | O(n^2) | O(n) | O(n^2) | O(n+k) | 稳定 |
| 基数排序(Radix Sort) | O(n*k) | O(n*k) | O(n*k) | O(n+k) | 稳定 |
其中,n表示输入元素的数量,k表示元素的取值范围大小。
稳定:如果a原本在b前面,而a=b,排序之后a仍然在b的前面。
不稳定:如果a原本在b的前面,而a=b,排序之后 a 可能会出现在 b 的后面。
时间复杂度:对排序数据的总的操作次数。反映当n变化时,操作次数呈现什么规律。
空间复杂度:是指算法在计算机 内执行时所需存储空间的度量,它也是数据规模n的函数。
1.冒泡排序(Bubble Sort)
冒泡排序是一种简单的排序算法,它重复地遍历要排序的数列,一次比较两个元素,如果它们的顺序错误就交换位置。这个过程持续对数列的末尾进行,直到整个数列都排序完成。


import org.junit.jupiter.api.Assertions;
import java.util.Arrays;
public class Bubble {
public static void bubbleSort(int[] arr) {
int n = arr.length;
for (int i = 0; i < n - 1; i++) {
for (int j = 0; j < n - i - 1; j++) {
if (arr[j] > arr[j + 1]) {
// 交换arr[j+1]和arr[j]
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
}
public static void main(String[] args) {
int[] arr = {5, 2, 8, 3, 1, 6};
int[] expectedArr = {1, 2, 3, 5, 6, 8};
Bubble.bubbleSort(arr);
System.out.println("arr = " + Arrays.toString(arr));
Assertions.assertArrayEquals(expectedArr, arr);
}
}
在上面的代码中, bubbleSort 函数接受一个整数数组作为输入,并使用冒泡排序算法对其进行排序。外部循环运行 n - 1 次,其中 n 是数组的长度,内部循环运行 n - i - 1 次,其中 i 是外部循环的当前迭代次数。这是因为在每次外部循环迭代后,最大的元素肯定在数组的末尾,因此我们不需要再次比较它。
在内部循环中,我们比较相邻的元素并交换它们,如果它们的顺序不正确。这样,最大的元素就“冒泡”到数组的末尾。在每次遍历数组后,最大的元素都处于它的最终位置,因此我们可以将内部循环的大小减少1。

浙公网安备 33010602011771号