在任何基数(基数)

时间:2015-06-08 22:00:31

标签: c arrays base radix-sort radix

我应该在C中编写一个算法,它在任何基数(基数)中取一个整数数组,然后使用Radix Sort将它们按升序排列。我的算法不能对数组的长度,位数和基数施加任何限制。当我说整数时,我并不是说我总是会收到一个int的数组,它可以是long int s,char s,char指针等数组。

看来,尽管处理对我的算法施加尽可能少的限制的最佳方法是通过访问它的位置来处理向量并将类型转换为{{1}所以这种方法的局限性在于用户必须使用数字" weight"符合代码编译的编码选项,即ASCII编码long unsigned int十进制基数为120,x为97,所以如果给定的基数使用数字a xa必须大于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<n; 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<n; i++)
            v[i] = semiSorted[i];
        significantDigit *= 10;
    }
}

结果输出为:

  

b36v未分类:014 000 8f6 080 056 00a 080

     

b36v已分类:014 000 8f6 080 080 056 00a

所以它没有按预期工作,我期望排序的矢量为:

  <00> 000 00a 014 056 080 080 8f6

我只能看到相同的条目按预期分组在一起。更改值并观察输出我认为算法可能会采用内存地址并对它们进行排序,因为在原始矢量的给定位置没有实际值,而是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; } 的数组。

我只是想知道是否有某种程度上我可以处理这些2D(甚至3D,4D,...)数组的情况,编写一个处理来自char / int数组的通用代码到char s的数组数组的数组,并且不需要太多的参数。我无法弄清楚如何在C中管理这种情况。

0 个答案:

没有答案