码迷,mamicode.com
首页 > 编程语言 > 详细

sort, nth_element 与 双关键字排序

时间:2017-10-02 17:15:20      阅读:235      评论:0      收藏:0      [点我收藏+]

标签:大于   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) .

 

sort, nth_element 与 双关键字排序

标签:大于   for   0.00   比较   set   logs   16px   blog   span   

原文地址:http://www.cnblogs.com/Sdchr/p/7620367.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!