实现类似于基数的排序

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 xk-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

【讨论】:

以上是关于实现类似于基数的排序的主要内容,如果未能解决你的问题,请参考以下文章

基数排序的具体实现及其原理

数据结构之排序算法Java实现—— 基数排序法

Python八大算法的实现,插入排序希尔排序冒泡排序快速排序直接选择排序堆排序归并排序基数排序。

快速排序实现(quickSort)

java方式实现基数排序

每日一算法|基数排序---第十一天