java - 逆向工程排序算法

标签 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);
}

最佳答案

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

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

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

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

关于java - 逆向工程排序算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27736850/

相关文章:

java - Elasticsearch High Level Rest Client - 带有类型(子)字段的 Java map - 日期、数字等

java - 在 Java 中,如何通过对象的构造函数将对象添加到数组?

javascript - 使用JS组织毡尖笔: optimizing the arrangement of items in a 2D grid by similarity of adjacent items, [更新]

java - 我们怎么能忽略Java中的一些SonarQube规则呢?

java - 为什么我的 Java Web 应用程序找不到 .bat 文件?

php - 将数组数组传递给函数,就好像它是单独的数组一样

algorithm - 使用动态规划将字符串拆分为一串有效单词

python - 我如何修改这个函数,以便它使用特定算法打印 1 和它的参数之间的整数?

algorithm - 为什么分治矩阵乘法算法中的递归步骤是8T(n/2)而不是8T(n/4)

Java 客户端抛出 SocketException : Connection reset when receiving data from C server. 为什么?