我得到了一些逆向工程算法。下面的算法是基数排序,但我对代码中实际发生的情况感到非常困惑。
我是算法新手,不确定代码如何对数组中的元素进行排序。我不确定哪些位与算法有关以及掩码是什么。这是代码:
ArrayList<Integer> array = CopyArray(a);
Integer[] zerobucket = new Integer[a.size()];
Integer[] onebucket = new Integer[a.size()];
int i, bit;
Integer element, mask;
for (bit=0; bit<8; ++bit) {
int zc = 0;
int oc = 0;
for(i=0; i<array.size(); ++i) {
element = array.get(i);
mask = 1 << bit;
if ((element & mask) == 0) {
zerobucket[zc++] = array.get(i);
} else {
onebucket[oc++] = array.get(i);
}
}
for(i=0; i<oc; ++i) array.set(i,onebucket[i]);
for(i=0; i<zc; ++i) array.set(i+oc,zerobucket[i]);
}
return(array);
学习编程应该从算法开始!
要了解一段未记录的代码的作用,您可能需要采用伪语言将其放入英语数学陈述中。
例如,您注意到此代码片段应该仅适用于 8 位数字(位上的外循环)。粗略的描述是,数组元素被“排序”到两个桶中,具体取决于位置“bit”中的位是零还是一——从租用有效位置中的位开始。然后对原始数组进行重新排序,“一”位于“零”之前......这应该对数组进行从最大到最小的排序。
您最好查找基数排序算法,并从该算法开始,而不是从代码开始。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)