2016-11-29 11 views
0

Я застрял в следующем вопросе на несколько дней. Я использовал C для реализации сортировки radix, все было прекрасно, за исключением одной строки кода. Не могли бы вы помочь мне решить эту проблему?Использование C для реализации radix sort

Моя проблема в первой строке функции radix_sort. Хотя я использую int semi_sort[12], я могу запустить программу правильно. Тем не менее, я хочу использовать переменную размера, которую я передал в функцию, но когда я использую int semi_sort[size] вместо int semi_sort[12], моя программа потерпит крах. Может ли кто-нибудь сказать мне, почему? Кстати, я ссылался на this link, в этом авторском коде он сделал 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; 
    } 
} 
+1

Если вы программируете на C, зачем добавлять тег C++? Не добавляйте несвязанные теги. –

+0

Обратите внимание, что вы назначаете 'most_num' в' main() ', но никогда не используете его. Вы должны удалить его - пусть код сортировки radix вызывает функцию. –

ответ

0

У вас есть проблемы с кодом:

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)).

+0

Спасибо за ваш ответ! Для первых двух циклов, о которых вы упомянули, я думаю, что шляпа подходит для моей реализации, поскольку я воспринимаю ее как сортировку, чтобы иметь дело только с положительным числом. И кроме использования malloc, могу ли я просто использовать переменную в массиве, когда объявляю массив? Большое вам спасибо! –

+0

Если я правильно понял, вам нужно объявить указатель на массив, для него будет выделена память. 'int * semi_sort; ... semi_sort = malloc (размер * (sizeof * semi_sort)); ... ' – freestyle

+0

' --bucket [(arr [i]/significant_num)% 10] может быть больше 11 или меньше, чем 0'. Значение не должно быть меньше 0, потому что ведро [(arr [i]/significant_num)% 10] было увеличено на количество раз, которое произошло (arr [i]/significant_num)% 10. Максимальное значение после предопределения будет размером 1. – rcgldr