鱼C论坛

 找回密码
 立即注册
查看: 1997|回复: 1

簡單經過改編的排序算法,你的編譯器能通過嗎?

[复制链接]
发表于 2014-6-21 22:14:38 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 andalousie 于 2014-6-21 23:06 编辑

這個演算法是改編的STL的 std::sort的某個實現版本,快排已經改得不是快排了,但是,重要的是,你的編譯器能跟我一樣編譯正常嗎?據我多次嘗試,沒有幾個編譯器會正常。問題可能出在decltype上面,可是我用的有錯嗎?
這裏貼出代碼
  1. //Quicksort_Experiment.cpp
  2. //author: andalousie
  3. #include <iostream>
  4. #include <algorithm>

  5. const int SORT_MAX = 16;

  6. template<class Ty> inline
  7. Ty median(Ty a, Ty b, Ty c)
  8. {
  9.         if (a < b)
  10.                 return (b < c ? b : a < c ? c : a);
  11.         else
  12.                 return (a < c ? a : b < c ? c : b);
  13. }

  14. template<class BI, class T> inline
  15. void unguarded_insert(BI i2, T v)
  16. {
  17.         for (BI scan = i2; v < *(--scan); i2 = scan)
  18.                 *i2 = *scan;
  19.         *i2 = v;
  20. }

  21. template<class BI> inline
  22. void insertion_sort(BI i1, BI i2)
  23. {
  24.         if (i1 == i2) return;
  25.         for (BI scan = i1; ++scan != i2; )
  26.         {
  27.                 decltype(*i1) v = *scan;
  28.                 if (!(v < *i1))
  29.                         unguarded_insert(scan, v);
  30.                 else
  31.                 {
  32.                         std::copy_backward(i1, scan, scan + 1);
  33.                         *i1 = v;
  34.                 }
  35.         }
  36. }

  37. template<class It, class T> inline
  38. void unguarded_partition(It i1, It i2, T pivot)
  39. {
  40.         for (; ; ++i1)
  41.         {
  42.                 for (; *i1 < pivot; ++i1);
  43.                 for (; pivot < *(--i2); );
  44.                 if (i2 < i1)
  45.                         return;
  46.                 std::swap(*i1, *i2);
  47.         }
  48. }

  49. template<class It> inline
  50. void sort(It i1, It i2)
  51. {
  52.         if (i2 - i1 <= SORT_MAX)
  53.                 insertion_sort(i1, i2);
  54.         else
  55.         {
  56.                 int distance = i2 - i1;
  57.                 for (It s = i1, e; SORT_MAX < distance; )
  58.                 {
  59.                         It save;
  60.                         if (distance >= i2 - s)
  61.                                 e = i2, distance >>= 1, save = i1;
  62.                         else
  63.                                 e = s + distance, save = e;
  64.                         unguarded_partition(s, e,
  65.                                 median(*s, *(s + (e - s) / 2), *(e - 1)));
  66.                         s = save;
  67.                 }
  68.                 insertion_sort(i1, i1 + SORT_MAX);
  69.                 for (i1 += SORT_MAX; i1 != i2; ++i1)
  70.                         unguarded_insert(i1, *i1);
  71.         }
  72. }

  73. int main()
  74. {
  75.         int a[] = {1,2,4,3,5,7,0,2,6,4,33,765,345,234,252,23,64,34,54,6,5,3,645,254,234,5,23,25,422,432};
  76.         sort(a, a+30);
  77.         for (int i = 0; i < 30; ++i)
  78.         std::cout << *(a+i) << " ";
  79. }
复制代码
QSExp.jpg
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2014-6-21 22:47:11 | 显示全部楼层
而且這個排序已經不快了。我一開始的目標是不用遞歸實現一下。現在還是有難度
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-25 03:53

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表