排序算法比较
算法性能比较
排序算法 | 平均时间复杂度 | 最坏时间复杂度 | 空间复杂度 | 稳定性 |
---|---|---|---|---|
快速排序 | O(n log n) | O(n²) | O(log n) | 不稳定 |
归并排序 | O(n log n) | O(n log n) | O(n) | 稳定 |
堆排序 | O(n log n) | O(n log n) | O(1) | 不稳定 |
插入排序 | O(n²) | O(n²) | O(1) | 稳定 |
选择排序 | O(n²) | O(n²) | O(1) | 不稳定 |
冒泡排序 | O(n²) | O(n²) | O(1) | 稳定 |
希尔排序 | O(n log n) | O(n²) | O(1) | 不稳定 |
计数排序 | O(n + k) | O(n + k) | O(k) | 稳定 |
1. 快速排序
1. void quickSort(int[] arr, int low, int high)
- 确定一个基准元素位置
- 基准左边递归快排
- 基准右边递归快排
- 条件判断low < high
2. int partition(int[] arr, int low, int high)
确定一个基准元素(即选择的比较元素)位置:
- 确定比较元素(随机,可以选择high下标位置)
- 用i记录<=基准元素 的最大下标
- 遍历low->high区间,将当前元素和比较元素比较,如果<=,则将i下标向前移动,并将当前下标和i下标元素交换位置。
- 将i+1下标元素(>比较元素的元素)和比较元素交换位置 , 从而确定了比较元素(基准元素)的位置
- 返回基准元素的下标
public class QuickSort {// 基础快速排序public static void quickSort(int[] arr) {quickSort(arr, 0, arr.length - 1);}// 1. 确定一个基准元素位置 2. 基准左边递归快排 3. 基准右边递归快排 4.条件判断low < highprivate static void quickSort(int[] arr, int low, int high) {// 注意这里是if, 不是whileif (low < high) {int pivotIndex = partition(arr, low, high);quickSort(arr, low, pivotIndex - 1);quickSort(arr, pivotIndex + 1, high);}}// 确定一个基准元素位置(即选择的比较元素):1. 确定比较元素(随机,可以选择high下标位置) 2. 用i记录<=基准元素 的最大下标 3. 遍历low->high区间,将当前元素和比较元素比较,如果<=,则将i下标向前移动,并将当前下标和i下标元素交换位置。4. 将i+1下标元素(>比较元素的元素)和比较元素交换位置 , 从而确定了比较元素(基准元素)的位置 5. 返回基准元素的下标private static int partition(int[] arr, int low, int high) {int pivot = arr[high];int i = low - 1;// 注意这里是 < high, 不是<=for (int j = low; j < high; j++) {if (arr[j] <= pivot) {i++;swap(arr, i, j);}}swap(arr, i + 1, high);return i + 1;}private static void swap(int[] arr, int i, int j) {int temp = arr[i];arr[i] = arr[j];arr[j] = temp;}public static void main(String[] args) {int[] arr = {64, 34, 25, 12, 22, 11, 90, 88};System.out.println("原始数组: " + Arrays.toString(arr));// 测试不同的排序算法int[] arr1 = arr.clone();QuickSort.quickSort(arr1);System.out.println("快速排序: " + Arrays.toString(arr1));
}