java写出 基数_在任何基数(基数)中排序整数

我应该在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中管理这种情况 .

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值