2014-10-11 2 views
0

У меня проблема с сортировкой пузырей большими данными. Это задание, и мой учитель явно сказал использовать сортировку пузырьков для сортировки этих больших данных. Я попробовал работать в небольшом файле, и он работает отлично, но у него проблемы с отображением чего-либо для большого файла. Я не знаю, в чем проблема. Я тоже должен использовать пузырь. Спасибо. Ниже представлен небольшой файл «small.txt». Большой файл «big.txt» здесь подходит, он содержит тысячи строк, но тот же формат, что и маленький файл, и моя программа приведена ниже: я ждал 1 час для вывода чего-либо, и программа все еще находится в прогресс для большого файла.Сортировка пузырьков не работает для большого файла, но он работает для небольшого файла

small.txt

FORD 2001 
NISSAN 2000 
JAYCO 2003 

Программа

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

int main() 
{ 
    FILE *read; 
    char lines[110000]; 
    int i=0, c, j,a; 
    char *make[111100]; 
    char *year[111100], *swapyear, *swapmake; 

    if((read = fopen("big.txt", "r")) == NULL) 
    { 
     printf("can't open %s\n", "big.txt"); 
     exit(1); 
    } 

    c=0; 
    while(fgets(lines, sizeof(lines), read)!=NULL){ 
     make[c] = strdup(strtok(lines, " ")); 
     year[c] = strdup(strtok(NULL, " ")); 
     c++; 
    } 


    for(j=0; j<c-1; j++){ 
     for(a=0; a<(c-j-1); a++){ 
      if(atoi(year[a]) > atoi(year[a+1])){ 
       swapyear = year[a]; 
       swapmake = make[a]; 
       year[a] =year[a+1]; 
       make[a] = make[a+1]; 
       year[a+1] = swapyear; 
       make[a+1] = swapmake; 
      } 
     } 
    } 

    for(j=0; j<=(c-1); j++) 
    { 
     printf("%s %s\n", make[j], year[j]); 
    }  


} 
+1

Возможно, проблема в том, что просто пузырьковая сортировка занимает очень много времени, и ваша программа просто не заканчивая. –

+1

Сообщения об ошибках важны: 'char * path =" usorted.txt "; if ((read = fopen (путь, "r")) == NULL) {perror (путь);} ' –

+2

Просто fyi, ваш пузырь сортировки ... нет. У вас нет swap-обнаружения. И вы должны преобразовывать год в 'int' во время чтения файла, сохраняя его в собственном массиве' int', а не многократно повторяя преобразование atoi в одни и те же данные снова и снова (и более) еще раз. – WhozCraig

ответ

0
This is the bubble sort algorithm. 
Note that it extends all the way through the data on each pass 
(unlike the OPs code) 

Шаг 1: Повторите шаги 2 и 3 для я = 1 к количеству записей сортировать

Шаг 2: Набор j = 1

Шаг 3: Rep есть в то время J < = п

 (A) if a[i] < a[j] 

     Then interchange a[i] and a[j] 

     [End of if] 

    (B) Set j = j+1 
    [End of Inner Loop] 

[End of Step 1 Outer Loop] 

Шаг 4: Выход

и вот реализация кода:

for(i=0 ; i<n ; i++) 
{ 
    for(j=0 ; j<n-i-1 ; j++) 
    { 
     if(arr[j]>arr[j+1]) //Swapping Condition is Checked 
     { 
      temp=arr[j]; 
      arr[j]=arr[j+1]; 
      arr[j+1]=temp; 
     } 
    } 
} 

выше использует переменную временную, как правило, плохая идея. Вот пример использования оператора XOR (и никакой переменной TEMP)

x = x^y (1) 
y = y^x (2) 
x = x^y (3) 
+3

Вы на самом деле отстаиваете xor трюк? https://en.wikipedia.org/wiki/XOR_swap_algorithm#Reasons_for_avoidance_in_practice –