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