Java 逆向工程排序算法
我已经得到了3个算法来进行逆向工程,并解释了它们是如何工作的,到目前为止,我已经得到了一个快速排序算法和一个气泡排序算法;但是我不确定这是什么算法。我知道快速排序和冒泡排序是如何工作的,但我就是不能理解这个算法。我不确定变量是什么,希望有人能告诉我这里发生了什么: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
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,争论相当学术化:如果您对整数(或长)排序在任何现实生活中的计算机程序中,位数都是一个常数。在某种程度上,它是数据类型的“函数”,而不是数组的大小。