嗨,我需要编写类似于排序的排序,也许它与基数排序类似 而且(这不是作业,因为我自己创造了问题,如果有人可以帮助我,请问)问题是这样的 假设我有数组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这意味着第一个元素大于第二个所以交换它< / p>
Paraphasing:
我需要创建一个类似于基数的排序。
假设我有一个数组:
int x[] = new int[] {4, 5, 3, 2, 1};
或者,以二进制形式:
5-0101 4-0100 3-0011 2-0010 1-0001
我想通过使用按位运算符对这些元素进行排序,或者检查每个位和(如果更少)交换它。例如,考虑5和4:
二进制中最左边或最高有效位(MSB)为5,MSB为4.自
0 == 0
以来,该过程继续进行。接下来的两位(0然后1)也是等效的。最后,最右边或最低有效位(LSB)为5,而4的LSB为0,表示应交换这两个值。
答案 0 :(得分:1)
要获取k
的{{1}}位,您可以执行以下操作:
int x
这是一个测试工具:
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
上的位31。如果是int
,则表示负数。您可能希望首先使用仅适用于正1
的实现,然后再添加对负数的支持。