非负整数的基数排序(按位)

Posted

技术标签:

【中文标题】非负整数的基数排序(按位)【英文标题】:Radix sort for non-negative integers (bitwise) 【发布时间】:2020-11-07 04:04:21 【问题描述】:

我正在尝试学习如何使用按位移位和排序算法,但我迷路了。我想使用整数的二进制表示并使用按位运算来使用基数排序对整数进行排序。我已经在 C 中使用小数应用了基数排序(下面的代码),但我不确定如何使用按位运算将相同的逻辑应用于基数排序。我想我会使用 0xFF 的掩码来左移整数的二进制表示。

如何使用左移和按位与对整数值应用基数排序?

#include <stdlib.h>
#include <stdio.h>

int max(int arr[], int size)
    int max = arr[0];
    for(int i = 1;i<size;i++)
        if(arr[i]>max)
            max = arr[i];
        
    
    return max;

void radixsort(int arr[], int size) 
    int maxNum = max(arr, size);
    int tenExp;
    for (tenExp = 1; maxNum / tenExp > 0; tenExp *= 10)
        int returnArr[size];
        int i, numOccurences[10] =  0 ;
        for (i = 0; i < size; i++)
            numOccurences[(arr[i] / tenExp) % 10]++;
        for (i = 1; i < 10; i++)
            numOccurences[i] += numOccurences[i - 1];
        for (i = size - 1; i >= 0; i--) 
            returnArr[numOccurences[(arr[i] / tenExp) % 10] - 1] = arr[i];
            numOccurences[(arr[i] / tenExp) % 10]--;
        
        for (i = 0; i < size; i++)
            arr[i] = returnArr[i];
    


void main(int argc, char *argv[])
    int size = 0;
    int* array = malloc(0 * sizeof(int));
    int res;
    int temp;
    int count;
    int i = 1;

    printf("Enter a count: ");
    scanf("%d",&count);


    while(i <= count)
        printf("Enter number: \n");
        res = scanf("%d",&temp);
        if(res == EOF) break;
        size++;
        array = realloc(array,size*sizeof(int));
        array[size-1] = temp;
        i++;
    
    radixsort(array,size);
    for(int i=0;i<size;i++)
        printf("%d\n",array[i]);
    


【问题讨论】:

如果它是非负数,为什么不使用unsigned 类型? 【参考方案1】:

我建议您修改相同的代码,仅使用算术运算对二进制数进行基数排序。这应该很简单。您必须使用2 而不是10 执行操作。

完成上述更改后,您可以使用以下等效的按位运算。

y = x&gt;&gt;1 等价于y = x/2

y = x&lt;&lt;1 等价于y = x*2

y = x&amp;1 等价于y = x%2

【讨论】:

我将 *= 10 和 % 10 更改为 *= 10 和 % 2。然后,我将它们更改为 exp 首先将函数radixsort中的10改为2即可。检查这是否适合您。之后将运算符更改为按位运算符。如果它仍然不适合您,请在此处再次粘贴新代码。 void radixsort(int arr[], int size) int maxNum = max(arr, size);国际十指数; for (tenExp = 1; maxNum / tenExp > 0; tenExp= 0; i--) returnArr[numOccurences[(arr[i] / tenExp)&1] - 1] = arr[i]; numOccurences[(arr[i] / tenExp)&1]--; for (tenExp = 1; maxNum / tenExp &gt; 0; tenExp&lt;&lt;1)更改为for (tenExp = 1; maxNum / tenExp &gt; 0; tenExp = tenExp&lt;&lt;1)

以上是关于非负整数的基数排序(按位)的主要内容,如果未能解决你的问题,请参考以下文章

4.10 基数排序

排序算法:Radix Sort 基数排序

数据结构——基数排序

基数排序与基数排序

我应该在基数排序中使用哪个基数?以及如何在基数之间转换?

排序算法 - 基数排序