2016-02-19 53 views
0

我一直在努力但是當我跑我的基數爲10碼,它工作正常,所有輸入端,用C編寫 基數排序算法,與基地16它只是排序的前10個元素都能正常。另外,對於任何其他基地,它不起作用。 我想做一個實現,推廣任何基地。板藍根實現排序

這裏是代碼至今,你能找到的任何問題?

#include <stdio.h> 
#include <stdlib.h> 
int size=32; 
int getMax(int arr[], int n) { 
    int mx = arr[0]; 
    int i; 
    for (i = 1; i < n; i++) 
     if (arr[i] > mx) 
      mx = arr[i]; 
    return mx; 
} 

void countSort(int arr[], int n, int exp, int base) { 
    int output[n]; 
    int i; 
    int count[base]; 
    memset(count,0,sizeof count); 
    for (i=0;i<n;i++) 
     count[(arr[i]/exp)%base]++; 
    for (i=1;i<base;i++) 
     count[i]=count[i]+count[i-1]; 
    for (i=n-1;i>=0;i--) { 
     output[count[ (arr[i]/exp)%base ]-1]=arr[i]; 
     count[ (arr[i]/exp)%base ]--; 
    } 
    for (i=0;i<n;i++) 
     arr[i]=output[i]; 
} 

void radixsort(int arr[],int n,int base) { 
    int exp; 
    int m=getMax(arr,n); 
    for (exp=1;m/exp>0;exp=exp*10) 
    countSort(arr,n,exp,base); 
} 

int main(int argc,char *argv[]) {  
    int num,i=0,j,n,m; 
    int *arr,*newarr=NULL; 
    FILE *fp1; 
    FILE *fp2; 
    int base=atoi(argv[1]); 
    fp1=fopen(argv[2],"r"); 
    if (fp1 == NULL) { 
    printf("Warning:File does not exists;please enter valid file name"); 
    exit(0); 
    } 
    fp2=fopen(argv[3],"w"); 
    if (fp2 == NULL) { 
     printf("Warning:File does not exists"); 
     exit(0); 
    } 
    arr= malloc(sizeof(int)*size); 
    fprintf(fp2,"before sorting:"); 
    while(fscanf(fp1,"%d",&num)==1) { 
    if(i<size) { 
     arr[i]=num; 
     i++; 
     fprintf(fp2,"%d ",num); 
     n=i; 
    } else { 
     newarr = malloc(sizeof(int)*2*size); 
     for(m=0;m<size;m++) { 
      newarr[m]=arr[m]; 
     } 
     free(arr); 
     size=size*2; 
     arr=&newarr[0]; 
    } 
    } 
    radixsort(arr,n,base); 
    fprintf(fp2,"\nAfter Sorting:"); 
    for (j=0;j<n;j++) 
    fprintf(fp2,"%d ",arr[j]); 

    fclose(fp1); 
    fclose(fp2); 
    return 0; 
} 
+0

你爲什麼不只是轉換爲10進制數? – Jacobr365

回答

0

看起來像for (exp=1;m/exp>0;exp=exp*10)是問題所在。我認爲您需要使用base而不是10

編輯:我試圖編譯和運行代碼,並沒有能夠得到它的工作,甚至對基地10

+0

Sorry..i不知道它爲什麼不就在你身邊運行,但是當我與基地10執行它,它炒菜很好.. – Trisha

+0

是否與我的建議改變其他基地工作? –