逆向工程排序算法

时间:2015-01-02 02:49:32

标签: java arrays algorithm sorting reverse-engineering

我已经获得了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);
}

2 个答案:

答案 0 :(得分:4)

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

每次迭代都会处理一个位b。它通过将p1次移位来准备一个名为b的面具。这产生的功率为2 - 1,2,4,8,......或1,10,100,1000,10000,......二进制。

对于每个位,原始数组中位b设置为10的元素数分为两个称为one和{{{0}的存储桶1}}。分离结束后,元素将被放回原始数组中,算法将继续进行下一次迭代。

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

答案 1 :(得分:1)

看起来像是一个逐位的基数排序给我,但它似乎是倒退。