时间复杂度
时间复杂度(Time complexity)是一个函数, 它定性描述算法的运行时间,常用大O表述, 它并不包含低阶项和首项系数。
大小比较
$$O(1) < O(log_2(n)) < O(n \cdot log_2(n)) < O(n) < O(n^2) < O(n^3) < O(2^n)$$
时间复杂度计算:
基本操作:$O(1)$
顺序结构:$O(T_1 + T_2 + \cdots + T_n)$
循环结构:$O(T_1 \times T_2 \times \cdots \times T_n)$
分支结构:$O(max(T_1, T_2, \cdots, T_n))$
排序
桶排序
基于:非比较
特性:无
性质:较稳定
时间复杂度:$O(n+k)$
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 #include <iostream> using namespace std;int main () { int n, a[101 ], count[100000 ], maxx = -1e9 ; cin >> n; for (int i = 1 ; i <= n; i++) { cin >> a[i]; count[a[i]]++; maxx = max (maxx, a[i]); } for (int i = 0 ; i <= maxx; i++) { while (a[i]--) { cout << i << ' ' ; } } return 0 ; }
冒泡排序
基于:比较
特性:通用
性质:稳定
时间复杂度:$O(n^2)$
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 #include <iostream> using namespace std;int main () { int n, a[101 ]; cin >> n; for (int i = 1 ; i <= n; i++) { cin >> a[i]; } for (int i = 1 ; i <= n - 1 ; i++) { bool end = true ; for (int j = 1 ; j <= n - i; j++) { if (a[j] > a[j + 1 ]) { swap (a[j], a[j + 1 ]); end = false ; } } if (end) { break ; } } for (int i = 1 ; i <= n; i++) { cout << a[i] << ' ' ; } return 0 ; }
sort排序
基于:未知
性质:未知
特性:多用于结构体及多关键字排序
时间复杂度:$未知$
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 #include <iostream> #include <algorithm> using namespace std;bool cmp (int x, int y) { return x > y; } int main () { int n, a[101 ]; cin >> n; for (int i = 1 ; i <= n; i++) { cin >> a[i]; } sort (a + 1 , a + 1 + n, cmp); for (int i = 1 ; i <= n; i++) { cout << a[i] << ' ' ; } return 0 ; }
快速排序
基于:比较
特性:目前速度最快
性质:不稳定
时间复杂度:$O(n \cdot log_2(n))$
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 #include <iostream> using namespace std;int a[101 ];void quicksort (int left, int right) { if (left >= right) { return ; } int mid = (left + right) / 2 ; swap (a[mid], a[right]); int i = left, j = right - 1 ; while (i <= j) { while (a[i] < a[right]) { i++; } while (a[j] > arr[right]) { j--; } if (i <= j) { swap (a[i], a[j]); i++; j--; } swap (a[i], a[right]); quicksort (left, i - 1 ); quicksort (i + 1 , right); } } int main () { int n; cin >> n; for (int i = 1 ; i <= n; i++) { cin >> a[i]; } quicksort (1 , 1 + n); for (int i = 1 ; i <= n; i++) { cout << a[i] << ' ' ; } return 0 ; }
选择排序
基于:比较
特性:交换次数最小
性质:不稳定
时间复杂度:$O(n^2)$
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 #include <iostream> using namespace std;void select_sort (int a[], int n) { for (int i = 0 ; i < n - 1 ; i++) { int min = i; for (int j = i + 1 ; j < n; j++) { if (a[j] < a[min]) { min = j; } } if (min != i) { swap (a[i], a[min]); } } } int main () { int a[100 ], n; cin >> n; for (int i = 0 ; i < n; i++) { cin >> a[i]; } select_sort (a, n); for (int i = 0 ; i < n; i++) { cout << a[i] << ' ' ; } return 0 ; }