标签:大于 for 0.00 比较 set logs 16px blog span
双关键字排序:
1 const int T = 100000; 2 int sa[N+5], sum[T], ord[N+5]; 3 void bsort(int *a) { 4 memset(sum, 0, sizeof sum); 5 for (int i = 1; i <= n; i++) sum[a[i] % T]++; 6 for (int i = 1; i < T; i++) sum[i] += sum[i-1]; 7 for (int i = 1; i <= n; i++) ord[sum[a[i] % T]--] = i; 8 9 memset(sum, 0, sizeof sum); 10 for (int i = 1; i <= n; i++) sum[a[i] / T]++; 11 for (int i = 1; i < T; i++) sum[i] += sum[i-1]; 12 for (int i = n; i >= 1; i--) sa[sum[a[ord[i]] / T]--] = ord[i]; 13 14 for (int i = 1; i <= n; i++) sa[i] = a[sa[i]]; 15 memcpy(a, sa, sizeof sa); 16 }
排序算法的效率比较如下图, 可见双关键字排序还是很优秀的.
n = 10 ^ 7 | n = 10 ^ 6 | n = 10 ^ 5 | n = 10 ^ 3 | |
stl::sort | 3.69 | 0.30 | 0.04 | 0.00 |
双关键字排序 | 1.63 | 0.17 | 0.05 | 0.01 |
nth_element 把第 n 小的元素放到第 n 个位置, 小于该元素的放到左边, 大于的放到右边.
手写的话考虑快速排序, 期望复杂度为 $n + n/2 + n/4 + ... = O(n)$ .
可以直接用 stl::nth_element(a+1, a+n, a+Length+1) .
标签:大于 for 0.00 比较 set logs 16px blog span
原文地址:http://www.cnblogs.com/Sdchr/p/7620367.html