【问题标题】:Reverse Engineer Sorting Algorithm逆向工程排序算法
【发布时间】:2015-02-28 11:19:03
【问题描述】:

我已经获得了 3 种算法来进行逆向工程并解释它们是如何工作的,到目前为止,我已经得出了一个快速排序算法和一个冒泡排序算法;但是我不确定这是什么算法。我了解快速排序和冒泡排序是如何工作的,但我就是无法理解这个算法。我不确定变量是什么,希望有人能告诉我这里发生了什么:

public static ArrayList<Integer> SortB(ArrayList<Integer> a)
{
    ArrayList<Integer> array = CopyArray(a);
    Integer[] zero = new Integer[a.size()];
    Integer[] one = new Integer[a.size()];
    int i,b;
    Integer x,p;
    //Change from 8 to 32 for whole integers - will run 4 times slower
    for(b=0;b<8;++b)
    {
        int zc = 0;
        int oc = 0;
        for(i=0;i<array.size();++i)
        {
            x = array.get(i);
            p = 1 << b;
            if ((x & p) == 0)
            {
                zero[zc++] = array.get(i);
            }
            else
            {
                one[oc++] = array.get(i);
            }
        }
        for(i=0;i<oc;++i) array.set(i,one[i]);
        for(i=0;i<zc;++i) array.set(i+oc,zero[i]);
    }
    return(array);
}

【问题讨论】:

    标签: java arrays algorithm sorting reverse-engineering


    【解决方案1】:

    这是一个Radix Sort,仅限于最低有效八位。除非您将循环更改为 32 次而不是 8 次,否则它不会完成排序。

    每次迭代处理一个比特b。它通过将1 向左移动b 次来准备一个名为p 的掩码。这会产生 2 的幂 - 1, 2, 4, 8, ... 或 1, 10, 100, 1000, 10000, ... 二进制。

    对于每个位,原始数组中位b 设置为10 的元素数被分成两个桶,分别称为onezero。分离结束后,将元素放回原数组,算法进行下一次迭代。

    此实现使用的存储空间是原始数组大小的两倍,并且总共遍历数组 16 次(完整版本为 64 次 - 一次用于读取,一次用于写入每个位的数据)。该算法的渐近复杂度是线性的。

    【讨论】:

    • 基数排序的渐近复杂度值得商榷。实际上,您引用的维基百科文章的第一部分标题为“效率”,并且对辩论进行了很好的总结。
    • @user3386109 好吧,关于基数排序的“辩论”围绕着一个论点,即我们必须处理的位数应该被视为基于N(即至少LogN)的函数基于一个隐含的假设,即所有键都可以是不同的。不过,我不确定这是否是一个可靠的假设,尤其是当我们对大量小数字进行排序时。
    • "基于一个隐含的假设,即所有键都可以是不同的" 更一般地表述为 "基于删除重复后数组大小的假设键是 O(N)"。您是正确的,对于数组中唯一键的数量远小于 N 的特殊情况,基数排序是线性的,即数组的大部分由重复的键组成。
    • @user3386109,争论相当学术:如果您在任何现实生活中的计算机程序中对整数(或长整数)进行排序,比特数是一个常数。在某种程度上,它是数据类型的“函数”,而不是数组的大小。
    【解决方案2】:

    对我来说,这看起来像是一个按位基数排序,但它似乎是倒序排序。

    【讨论】:

    • 但是为什么外循环只执行了8次。
    • 它只对低 8 位进行排序以提高速度——正如评论所说,所有 32 位都慢 4 倍。
    猜你喜欢
    • 2016-11-23
    • 2013-10-14
    • 1970-01-01
    • 1970-01-01
    • 2011-01-17
    • 2011-05-09
    • 1970-01-01
    • 1970-01-01
    • 2010-09-10
    相关资源
    最近更新 更多