晚上,腾讯的面试官让我写出熟记的最复杂的排序算法,我猜他是想让我写那几个O(n log n)的排序算法。然而,好久没看排序了,一时之间只写出了O(n^2),结果可想而知……
首先,定义交换函数swap,用于交换数组中任意两个位置的值。
1 | private static void swap(int[] arr, int i, int j) { |
接下来,使用8种排序算法,对数组进行升序排序。
交换排序
冒泡排序
- 向上浮
1 | public static void bubbleSort(int[] arr) { |
- 向下沉
1 | public static void bubbleSort(int[] arr) { |
快速排序
1 | public static void quickSort(int[] arr) { |
插入排序
直接插入排序
1 | public static void insertionSort(int[] arr) { |
希尔排序
1 | public static void shellSort(int[] arr) { |
选择排序
直接选择排序
1 | public static void selectionSort(int[] arr) { |
堆排序
1 | public static void heapSort(int[] arr) { |
归并排序
1 | public static void mergeSort(int[] arr) { |
基数排序
1 | public static void radixSort(int[] arr) { |
比较
排序算法 | 最好的时间复杂度 | 平均时间复杂度 | 最坏的时间复杂度 | 空间复杂度 | 稳定性 |
---|---|---|---|---|---|
冒泡排序 | O(n) | O(n^2) | O(n^2) | O(1) | 稳定 |
快速排序 | O(n log n) | O(n log n) | O(n^2) | 最好O(log n) 最坏O(n) |
不稳定 |
直接插入排序 | O(n) | O(n^2) | O(n^2) | O(1) | 稳定 |
希尔排序 | O(n log n) | O(n^1.3) | O(n^2) | O(1) | 不稳定 |
直接选择排序 | O(n^2) | O(n^2) | O(n^2) | O(1) | 不稳定 |
堆排序 | O(n log n) | O(n log n) | O(n log n) | O(1) | 不稳定 |
归并排序 | O(n log n) | O(n log n) | O(n log n) | O(n) | 稳定 |
基数排序 | O(d(n + r)) | O(d(n + r)) | O(d(n + r)) | O(n+r) | 稳定 |
其中,n表示关键字的个数,d表示关键字的最大长度,r表示关键字的基数。