V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
一个帮你系统化验证交易想法的小工具
我厌倦了手动回测和复杂的脚本,所以写了这个工具。它用声明式JSON定义策略(可视化为DAG),让你能快速迭代和验证自己的投资灵感。
Promoted by bmpidev2019
adaofu123
V2EX  ›  算法

beautiful code, quick short. 参数自增问题。

  •  
  •   adaofu123 · 2017-01-04 21:10:33 +08:00 · 3019 次点击
    这是一个创建于 3108 天前的主题,其中的信息可能已经有所发展或是发生改变。
    EXAMPLE 3-1 . Quicksort function
    void quicksort(int l, int u)
    { int i, m;
    if (l >= u) return;
    swap(l, randint(l, u));

    m = l;
    for (i = l+1; i <= u; i++)
    if (x[i] < x[l])
    swap(++m, i);
    swap(l, m);
    quicksort(l, m-1);
    quicksort(m+1, u);
    }

    写这章的人,就是发明这个算法的人。我看了下其当时写的论文,也的确是这样写的。
    但是,我有点理解不了 swap(++m,l)这个函数调用。++m 应该是先增,然后再推入栈,那么其每次 while 循环在 swap 相同的元素。我测试了下 gcc 5.4,的确在 swap 相同元素。
    而且英文维基百科,写的算法,也是先swap,后自增。

    我的理解哪里有问题?还是说这种写法的行为,取决于编译器的处理?
    请大家帮忙看看。谢谢。
    2 条回复    2017-02-17 02:50:03 +08:00
    adaofu123
        1
    adaofu123  
    OP
       2017-01-05 14:54:30 +08:00
    额。明白了,的确是在 swap 相同元素。
    但是 while 循环的目的,不是改变元素顺序,而是将 m 递增并把小于 l 的元素赋值给 m 递增后对应的元素, i 对应的元素不变化。 while 循环之后,哨兵 m 就是 l 对应元素排序后应该处的位置。
    jedihy
        2
    jedihy  
       2017-02-17 02:50:03 +08:00
    能把这个原算法论文贴一下?
    关于   ·   帮助文档   ·   自助推广系统   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1021 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 36ms · UTC 18:48 · PVG 02:48 · LAX 11:48 · JFK 14:48
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.