微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

非负整数的基数排序按位

如何解决非负整数的基数排序按位

我试图学习如何使用按位移位和排序算法,但我迷失了方向。我想使用整数的二进制表示形式,并使用按位运算使用基数排序对整数进行排序。我已经在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]);
    }
}

解决方法

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

完成上述更改后,就可以使用以下等效的按位操作。

y = x>>1等同于y = x/2

y = x<<1等同于y = x*2

y = x&1等同于y = x%2

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。