我应该在C中编写一个算法,它在任何基数(基数)中取一个整数数组,并使用Radix Sort将它们按升序排列 . 我的算法不能对数组的长度,位数和基数施加任何限制 . 当我说整数时,我并不是说我总是会收到一个 int 的数组,它可以是一个 long int , char , char 指针等数组 .
看来,我虽然处理对我的算法施加尽可能少的限制的最佳方法是通过访问它的位置来处理向量并将类型转换为 long unsigned int ,因此这种方法的局限性在于用户必须使用符合代码编译的编码选项的数字"weight",即ASCII编码 x 十进制基数为120且 a 为97,所以如果给定的基数使用数字 x 和 a , x 必须更大比 a .
这是我的算法:
/*!
* @function radixSort
* @abstract Sort a vector using Radix Sort.
* @discussion This function take a vector of positive
* integers in any base (radix) and sorts
* it in ascending order using the Radix
* Sort algorithm.
* @param v the vector with elements to sort
* @param n the length of the vector v
* @param getMax the function to get the maximum element of v
*/
void radixSort(void *v[], long unsigned int n, long unsigned int (*getMax)(void*[], long unsigned int)) {
long unsigned int i;
void* semiSorted[n];
long unsigned int significantDigit = 1;
long unsigned int max = (*getMax)(v, n);
while (max / significantDigit > 0){
long unsigned int intermediate[10] = {0};
for(i=0; i
intermediate[(long unsigned int)v[i]/significantDigit % 10]++;
for(i=1; i<10; i++)
intermediate[i] += intermediate[i-1];
for(i=n; i>0; i--)
semiSorted[--intermediate[(long unsigned int)v[i-1]/significantDigit % 10]] = v[i-1];
for(i=0; i
v[i] = semiSorted[i];
significantDigit *= 10;
}
}
此算法适用于我测试的所有类型,但是字符串数组 . 如果我有类似的东西:
int main() {
char *b36v[7] = {"014", "000", "8f6", "080", "056", "00a", "080"};
printf("b36v unsorted: "); for(i=0; i<7; i++) printf("%s ", b36v[i]); printf("\n");
radixSort(b36v, 7, getMaxFunc);
printf("b36v sorted : "); for(i=0; i<7; i++) printf("%s ", b36v[i]); printf("\n");
return 0;
}
结果输出将是:
b36v未分类:014 000 8f6 080 056 00a 080 b36v已分类:014 000 8f6 080 080 056 00a
所以它没有按预期工作,我期望排序的矢量是:
000 00a 014 056 080 080 8f6
我只能看到相同的条目按预期分组在一起 . 更改值并观察输出我认为算法可能是采用内存地址并对它们进行排序,因为在原始向量的给定位置没有实际值,而是一个 char 的数组 .
我只是想知道是否有某些我可以处理这些2D(甚至3D,4D,...)数组的情况,编写一个通用代码,处理从 int / char 数组到数组数组的数组... long unsigned int s并且没有要求太多参数 . 我无法弄清楚如何在C中管理这种情况 .