1. 程式人生 > >sort, nth_element 與 雙關鍵字排序

sort, nth_element 與 雙關鍵字排序

直接 -- 16px 元素 ont sum log set int

  雙關鍵字排序:

 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) .

sort, nth_element 與 雙關鍵字排序