排序算法
排序算法
一.概述
排序算法应该是很多人学习算法的第一课。
二.排序算法的分类及各排序算法的时间空间复杂度
- 简单排序算法:选择排序、冒泡排序、插入排序
- 插入的进阶版:希尔排序
- 二叉树相关: 堆排序
- 递归相关: 归并排序、快速排序
- 桶思想: 计数排序、基数排序、桶排序
- 其他
-> 重点关注4种:插入排序、堆排序、归并排序和快速排序
-> 各排序算法的时间空间复杂度
| 中文名称 | 英文名称 | 平均时间复杂度 | 最坏时间复杂度 | 最好时间复杂度 | 空间复杂度 | 稳定性 |
| 选择排序 | Selection | n2 | n2 | n2 | 1 | N |
| 冒泡排序 | Bubble | n2 | n2 | n | 1 | Y |
| 插入排序 | Insertion | n2 | n2 | n | 1 | Y |
| 堆排序 | Heap | nlog2 n | nlog2 n | nlog2 n | 1 | N |
| 希尔排序 | Shell | n1.3 | n2 | n | 1 | N |
| 归并排序 | Merge | nlog2 n | nlog2 n | nlog2 n | n | Y |
| 快速排序 | Quick | nlog2 n | n2 | nlog2 n | log2 n | N |
| 计数排序 | Counting | n + k | n + k | n + k | n + k | Y |
| 基数排序 | Radix | n * k | n * k | n * k | n + k | Y |
| 桶排序 | Bucket | n + k | n2 | n | n + k | Y |
三.示例
-
选择排序
- 冒泡排序
View Code1 public void sort(int[] arr) { 2 for (int i = arr.length - 1; i > 0; i--) { 3 for (int j = 0; j < i; j++) { 4 if(arr[j] > arr[j+1]){ 5 swap(arr, j, j+1); 6 } 7 } 8 } 9 } 10 11 /** 优化最好情况时间复杂度为 N */ 12 public void optimized(int[] arr){ 13 boolean isOk; 14 for (int i = arr.length - 1; i > 0; i--) { 15 isOk = true; 16 for (int j = 0; j < i; j++) { 17 if(arr[j] > arr[j+1]){ 18 swap(arr, j, j+1); 19 isOk = false; 20 } 21 } 22 if(isOk) break; 23 } 24 }
- 插入排序
- 希尔排序
- 计数排序
- 基数排序
- 归并排序
- 快速排序
北冥有鱼,其名为鲲,鲲之大一锅炖不下;
化而为鸟,其名为鹏,鹏之大需要两个烧烤架。


浙公网安备 33010602011771号