基数排序算法

我已经获得了一些逆向工程算法。 下面的算法是一个基数排序,但我对代码中实际发生的事情感到非常困惑。

我是算法新手,不确定代码如何对数组中的元素进行排序。 我不确定哪些位与算法有关,以及掩码是什么。 这是代码:

ArrayList 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”中的位是零还是一来将数组元素“排序”成两个桶 – 从租用有效位置的位开始。 然后对原始数组进行重新排序,其中“ones”位于“零”之前..这应该从最大到最小排序数组。

您可以很好地查找基数排序算法,并从中开始,而不是从代码开始。

您的算法适用于8位数字,您一次只能看一位。 一个更容易理解的例子如下,使用十进制而不是二进制。

 Sort on 1s: 771 721 822 955 405 5 925 825 777 28 829 Sort on 10s: 405 5 721 822 925 825 28 829 955 771 777 Sort on 100s: 5 28 405 721 771 777 822 825 829 925 955 

在我们对中间数字进行排序之后,观察数字是按其最后两位数排序的。 在我们对最重要的数字进行排序后,数字将完全排序。

二进制也是如此。 我们用于排序的桶的数量是SAME,作为在一次存储桶或计数排序期间用作排序键的数字的基数 。 “Radix”是数字基数的同义词,因此称为“基数排序”。 在您的示例中, 数字为2。

掩码或位掩码用于“关闭”除了允许通过掩码“看到”的位之外的每一位。 0 s过滤掉它们所用的位, 1 s允许该位通过。 常见的用法是隔离整数数据类型的字节大小的部分:

 00000000 11111111 00000000 00000000 & // Boolean AND 10010101 10010101 10010101 10010101 yields 00000000 10010101 00000000 00000000 
 /*try this iterative method and 100% working*/ #include #include int sort(); int display(); long int a[20],n; int main(){ int i; printf("enter the size:"); scanf("%d",&n); printf("\nenter the array elements\n"); for(i=0;i