实现类似于基数的排序
Posted
技术标签:
【中文标题】实现类似于基数的排序【英文标题】:Implement sort similar to radix 【发布时间】:2010-05-19 09:44:52 【问题描述】:您好,我需要编写 sucj 排序,可能类似于基数排序 而且(这不是家庭作业,因为我自己创造了它的问题,如果有人可以帮助我请)问题是这样的 假设我有数组 int x[]=new int[]4,5,3,2,1; 让我们把它写成二进制形式 5 -0101 4- 0100 3-0011 2-0010 1-0001 我想通过使用按位操作对这些元素进行排序或检查每一位,如果交换较少,任何人都可以帮助我 例如取 5 和 4 检查最右边的第一个位 0==0 所以继续在 1 索引中也 1==1 下一个相同的 0=0 和最后一个 1>0 这意味着第一个元素大于第二个所以交换它
释义:
我需要创建一个类似于基数的排序。
假设我有一个数组:
int x[] = new int[] 4, 5, 3, 2, 1;
或者,二进制形式:
5-0101 4-0100 3-0011 2-0010 1-0001
我想使用按位运算符对这些元素进行排序,或者检查每个位并(如果更少)交换它。例如,考虑 5 和 4:
二进制中 5 的最左边或最高有效位 (MSB) 为 0,4 的 MSB 也是如此。由于
0 == 0
,该过程继续进行。接下来的两位(0 然后 1)也是等价的。最后,5 的最右边或最低有效位 (LSB) 为 1,而 4 的 LSB 为 0,表示这两个值应该交换。
【问题讨论】:
你的标点符号怎么了!? @Greg S:谢谢,有时我会忍不住尝试破译我可能感兴趣的问题;我认为这对社区有帮助! 【参考方案1】:要获取int x
的k
-th 位,您可以执行以下操作:
int bit = (x >> k) & 1;
这是一个测试工具:
int xs[] = 4,5,3,2,1;
for (int k = 0; k < 4; k++)
for (int x : xs)
int bit = (x >> k) & 1;
System.out.format("|%s| ", bit);
System.out.println();
此打印(带注释)
x= 4 5 3 2 1 k=
|0| |1| |1| |0| |1| 0
|0| |0| |1| |1| |0| 1
|1| |1| |0| |0| |0| 2
|0| |0| |0| |0| |0| 3
这里的棘手位是符号位,即int
上的位 31。当它是1
时,它表示一个负数。您可能希望首先有一个仅适用于正数 int
的实现,然后再添加对负数的支持。
另见
Wikipedia/Two's complement【讨论】:
以上是关于实现类似于基数的排序的主要内容,如果未能解决你的问题,请参考以下文章