Java 逆向工程排序算法

Java 逆向工程排序算法,java,arrays,algorithm,sorting,reverse-engineering,Java,Arrays,Algorithm,Sorting,Reverse Engineering,我已经得到了3个算法来进行逆向工程,并解释了它们是如何工作的,到目前为止,我已经得到了一个快速排序算法和一个气泡排序算法;但是我不确定这是什么算法。我知道快速排序和冒泡排序是如何工作的,但我就是不能理解这个算法。我不确定变量是什么,希望有人能告诉我这里发生了什么: public static ArrayList<Integer> SortB(ArrayList<Integer> a) { ArrayList<Integer> array = CopyA

我已经得到了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);
}
publicstaticarraylistsortb(arraylista)
{
ArrayList数组=CopyArray(a);
整数[]零=新整数[a.size()];
整数[]一=新整数[a.size()];
int i,b;
整数x,p;
//将整数从8更改为32-运行速度将慢4倍

for(b=0;b在我看来像是逐位基数排序,但它似乎是在向后排序。

在我看来像是逐位基数排序,但它似乎是在向后排序。

这是a,限制在最低有效位的8位。除非将循环改为32次而不是8次,否则它不会完成排序

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

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

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

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

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

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


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

但是为什么外循环只执行8次。它只是对较低的8位进行排序以提高速度——正如注释所说,执行所有32位的速度要慢4倍。但是为什么外循环只执行8次。它只是对较低的8位进行排序以提高速度——正如注释所说,执行所有操作32位的速度慢了4倍。基数排序的渐进复杂性是有争议的。事实上,您引用的维基百科文章的第一节标题是“效率”,并且对这场争论有一个很好的总结。@user3386109“辩论”基于基数排序的中心论点是,我们必须处理的位数应该被视为
N
(即,至少
LogN
)的函数,基于所有键都可以不同的隐式假设。不过,我不确定这是否是一个可靠的假设,特别是如果我们对许多小数字进行排序的话。“基于所有键都可能不同的隐式假设”更一般地表述为“基于移除重复键后数组大小为O(N)的假设”“。在数组中唯一键的数量远小于N的特殊情况下,基数排序是线性的,这是正确的,即数组的大多数由重复键组成。@user3386109,争论相当学术化:如果您对整数(或长)排序在任何现实生活中的计算机程序中,位数都是一个常数。在某种程度上,它是数据类型的“函数”,而不是数组的大小。基数排序的渐进复杂性是有争议的。事实上,您引用的维基百科文章的第一部分标题为“效率”并且对争论有一个很好的总结。@user3386109关于基数排序的“争论”围绕着一个论点,即我们必须处理的位数应该被视为
N
的函数(即,至少
LogN
)基于所有键都可以不同的隐式假设。但是,我不确定这是否是一个可靠的假设,特别是如果我们对许多小数字进行排序的话。“基于所有键都可以不同的隐式假设”更一般地说是“基于移除重复键后数组大小为O(N)”的假设”。在数组中唯一键的数量远小于N的特殊情况下,基数排序是线性的,这是正确的,即数组的大多数由重复的键组成。@user3386109,争论相当学术化:如果您对整数(或长)排序在任何现实生活中的计算机程序中,位数都是一个常数。在某种程度上,它是数据类型的“函数”,而不是数组的大小。