2016-11-29 58 views
0

我陷入了下面的問題幾天。我用C來實現基數排序,除了一行代碼外,一切都很好。你能幫我解決這個問題嗎?使用C實現基數排序

我的問題是在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

請注意,您在'main()'中分配了'largest_num',但從不使用它。你應該刪除它 - 讓基數排序代碼調用該函數。 –

回答

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(size *(sizeof * semi_sort)); ...' – freestyle

+0

'--bucket [(arr [i]/significant_num)%10]可以大於11或小於0。該值不應小於0,因爲bucket [(arr [i]/significant_num)%10]增加了(arr [i]/significant_num)%10發生的次數。處理後的最大值爲1。 – rcgldr