常用排序算法总览
插入排序法 | 直接插入排序 | 希尔排序 |
交换排序 | 冒泡排序 | 快速排序 |
选择排序 | 直接选择排序 | 堆排序 |
归并排序 | 基数排序 |
时间复杂度基础知识
注意:通常时间复杂度的有小到大排序依次为: O ( 1 ) < O ( log 2 n ) < O ( n ) < O ( n log 2 n ) < O ( n 2 ) < O ( n 3 ) < O ( n k ) < O ( 2 n ) < ( n ! ) {O\left( 1 \right) < O\left( { { {\log }_2}n} \right) < O\left( n \right) < O\left( {n{ {\log }_2}n} \right) < O\left( { {n^2}} \right) < O\left( { {n^3}} \right) < O\left( { {n^k}} \right) < O\left( { {2^n}} \right) < \left( {n!} \right)} O(1)<O(log2n)<O(n)<O(nlog2n)<O(n2)<O(n3)<O(nk)<O(2n)<(n!)
- O ( 1 ) {O\left( 1 \right) } O(1):常数阶,无论代码执行多少行,只要没有循环体就是常数阶。消耗的时间并不随着变量的增长而增长。
- O ( log 2 n ) {O\left( { { {\log }_2}n} \right)} O(log2n):对数阶,循环条件中,判断变量以二倍变化逼近结束条件。
- O ( n ) {O\left( n \right)} O(n):线性阶,只循环n次,如一个for循环。
- O ( n log 2 n ) {O\left( {n{ {\log }_2}n} \right) } O(nlog2n):线性对数阶,将对数阶循环n次。
- O ( n 2 ) {O\left( { {n^2}} \right)} O(n2):平方阶,两个线性阶嵌套。
通常优先讨论时间复杂度,使用空间换取时间。
交换方法
- 数组类的排序通常把指定的位置交换的方法单独定义,这样可以提高代码的阅读性,下面第一种是普通交换方法,第二种是异或交换方法。
加减法交换不推荐,有越界风险。
// 临时中间变量交换法
public static void swap(int[] arr, int i, int j) {
int tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
}
- 当 i 严格保证与 j 不相同时,可以使用异或运算。
// 异或法(重要的事说三遍:i与j不能相同!i与j不能相同!i与j不能相同!)
public static void swap(int[] arr, int i,