繁体   English   中英

使用C实现基数排序

[英]Using C to implement radix sort

我陷入了以下问题几天。 我使用C来实现基数排序,除一行代码外,其他一切都很好。 您能帮我解决这个问题吗?

我的问题是在radix_sort函数的第一行。 当我使用int semi_sort[12] ,我可以正确运行该程序。 但是,我想使用传递给函数的size变量,但是当我使用int semi_sort[size]而不是int semi_sort[12] ,我的程序将崩溃。 谁能告诉我为什么? 顺便说一句,我在作者的代码中提到了此链接 ,他做了int semiSorted[size] 为什么这段代码这段时间起作用?

先感谢您!!

#include <stdio.h>
#include <stdlib.h>

#define bucket_size 10

int find_the_largest(int arr[],int size);
void display(int arr[],int size);
void radix_sort(int arr[],int size);

int main()
{
    printf("------------------------------------------------------\n");
    printf("        Hey! This is a radix sort algorithm!\n");
    printf("------------------------------------------------------\n\n");
    int array[] = {10, 2, 303, 4021, 293, 1, 0, 429, 480, 92, 2999, 14};
    int size = sizeof(array)/sizeof(int);
    int largest_num = find_the_largest(array,size);
    printf("The unsorted array:");
    display(array,size);
    printf("The radix sort algorithm:\n\n");
    radix_sort(array,size);
    display(array,size);
    return 0;
}

int find_the_largest(int arr[],int size){
    int i,max_num=0;
    for(i=0;i<size;i++){
        if(arr[i]>max_num)
            max_num = arr[i];
    }
    return max_num;
}

void display(int arr[],int size){
    int i;
    for(i=0;i<size;i++){
        printf(" %d",arr[i]);
    if(i==size-1)
        printf("\n\n");
    }
}

void radix_sort(int arr[],int size){

    int semi_sort[12];
    int max_num = find_the_largest(arr,size);
    int i,significant_num = 1;

    while(max_num/significant_num>0){
        int bucket[bucket_size] = {0};

        for(i=0;i<size;i++){
            bucket[(arr[i]/significant_num)%10]++;
        }

        for(i=1;i<size;i++){
            bucket[i] += bucket[i-1];
        }

        for(i=size-1;i>=0;i--){

            semi_sort[--bucket[(arr[i]/significant_num)%10]] = arr[i];
        }


        for(i=0;i<size;i++)
            arr[i] = semi_sort[i];

        significant_num *= 10;
    }
}

您的代码有问题:

for(i=1;i<size;i++){
    bucket[i] += bucket[i-1];
}

因为size可以大于bucket_size

可能您有以下问题:

for(i=size-1;i>=0;i--){
    semi_sort[--bucket[(arr[i]/significant_num)%10]] = arr[i];
}

因为--bucket[(arr[i]/significant_num)%10]可以大于11或小于0。

并且find_the_largest在负数上无法正常工作。

您可以为缓冲区动态分配内存,如下所示:

semi_sort = malloc(size * (sizeof *semi_sort));

并且不要忘记最后释放内存( free(semi_sort) )。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM