2016-02-18 7 views
-2

Я попытался написать сортировку по основанию в c.when я запустил свой код со статическим массивом, который работает хорошо. но когда я пытаюсь взять случайные входы из файла он дает мне «вино Сегментации» во время выполнения time.help Пожалуйста, просто помочь изменить этот код вот мой код:Алгоритм сортировки Radix в c

#include <stdio.h> 
#include <stdlib.h> 
#include<math.h> 
#include<string.h> 
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 - 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 m = getMax(arr, n); 
    int exp; 
    for (exp = 1; m/exp > 0; exp *= 10) 
    countSort(arr, n, exp , base); 
} 
void print(int arr[], int n) 
{ 
    int i; 
    for (i = 0; i < n; i++) 
    printf("%d ",arr[i]); 
} 
int main(int argc,int argv[]) 
{ 
    int base=atoi(argv[1]); 
    int num,i; 
    FILE *fp1=fopen("myFile1.txt","r"); 
    int arr[50]; 
    while(fscanf(fp1,"%d",&num)==1) 
    { 
     arr[i]=num; 
     i++; 
    } 
    int n = sizeof(arr)/sizeof(arr[0]); 
    radixsort(arr, n ,base); 
    print(arr, n); 
    fclose(fp1); 
    return 0; 
} 
+1

'arr [i] = num;': 'i' не инициализируется. – BLUEPIXY

ответ

1

Вы полагаете, что компилятор задает начальное значение i равным 0. Однако это не гарантируется. В то время как многие компиляторы сбрасывают переменные в 0, многие другие просто оставляют содержимое памяти, установленное во всем, что было во время компиляции или во время загрузки. Перед использованием необходимо инициализировать значение.

Кроме того, вы не тестируете, чтобы убедиться, что вы не перекрываете буфер arr. Например, рассмотрите, что произойдет с arr [], если вам удастся открыть файл, содержащий 51 элемент. Вы попытались бы добавить запись в arr [50], которая переполняет буфер.

Вам необходимо инициализировать i до 0 и, чтобы убедиться, что я становлюсь слишком большим.

Расчет n всегда равен 50, потому что arr - 50 ints. Вы должны использовать i как счетчик количества записей.

int main(int argc,int argv[]) 
{ 
    int base=atoi(argv[1]); 
    // int num,i; // This is the line that causes the error 
    int num; 
    int i = 0; // This needs to be initialized before use. 
    FILE *fp1=fopen("myFile1.txt","r"); 
    int arr[50]; 
    // You need to ensure that i does not overrrun the buffer. 
    while(fscanf(fp1,"%d",&num)==1 && (i < 49)) 
    { 
     arr[i]=num; 
     i++; 
    } 
    // Since i was defined before the while, it should have the correct count 
    // This calculation of n is wrong if fewer than a full buffer is read 
    int n = sizeof(arr)/sizeof(arr[0]); 
    radixsort(arr, n, base); 
    print(arr, n); 
    fclose(fp1); 
    return 0; 
} 
Смежные вопросы