Сортировка пузырьком!

Тема в разделе "C и С++ FAQ", создана пользователем chipset, 10 фев 2008.

  1. chipset

    chipset Гость

    Есть программа, сортирующая слова в алфавитном пиорядке методом пузырька (BubbleSort). Считка и запись в текстовые файлы, их там три: 1й-исходный, 2й-промежуточный, и 3й-отсортированный. Все хорошо но никак не могу присобачить порядковые номера к каждой строчке..так чтобы во втором файле получилось!

    1 шла
    2 собака
    3 по
    4 роялю

    а в третем соответственно..

    3 по
    4 роялю
    2 собака
    1 шла


    Код (Text):
    $this_var =


    #include <iostream>
    #include <windows.h>
    #include <cstring>
    using namespace std;

    // сортировка пузырьком
    void bubbleSort(char **a,int size) {
    int i, j;
    char* x;

    for( i=0; i < size; i++) {          // i - номер прохода
    for( j = size-1; j > i; j-- ) {  // внутренний цикл прохода
    if (strcmp(a[j-1],a[j])>0){
    x=a[j-1];
    a[j-1]=a[j];
    a[j]=x;
    }
    }
    }
    }

    // Сохранение массива слов
    void save(char **a,FILE *f){
    int i=0;
    // пока не встретим NULL пишем в файл
    while(a[i]!=NULL){
    fputs(a[i++],f);
    fputs("\n",f);
    }
    }

    void main(){
    int size =10000; // размер массива слов (массива указателей на char)
    int str_size =512; // размер одной строки
    char **ar = new char*[size]; // выделяем память под массив указателей
    for(int i=0;i<size;i++) // заполняем массив NULL_указателями
    ar[i] = NULL;// Изначально массив пустой
    FILE *f = fopen("1.txt","r"); // открываем исходный файл
    i=0;
    char buf[128]; // под строку
    char *token; // вспомагательн для strtok в каждый укахатель адрес след ликсемы слаживать
    char sep[] = " -,.!)(?:\ t\n\" "; // разделители
    // пока не конец файла и не предел массива строк запоминаем строки в массив строк
    while(!feof(f) && i<size){
    fgets(buf,128,f);
    token = strtok(buf,sep);

    while(token!=NULL){// если нет след слова то 0 выход
    ar[i] = new char[54];
    strcpy(ar[i],token);
    i++;
    token = strtok(NULL,sep);
    }
    }




    fclose(f); // закрываем исходный файл

    f = fopen("2.txt","w");
    save(ar,f);
    fclose(f);

    bubbleSort (ar,i); // Сортируем
    f = fopen("3.txt","w");
    save(ar,f);
    fclose(f);

    // освобождаем память
    for(i=0;i<size;i++)
    delete ar[i];

    delete [] ar;

    }
    Очень буду благодарен если подскажете как реализовать!..
     
  2. gamecreator

    gamecreator Гость

    ты знаком с strcpy?
     
  3. chipset

    chipset Гость

    ну знаком..а што ты этим хотел сказать?..
    Код (Text):
    x=a[j-1];
    a[j-1]=a[j];
    a[j]=x;
     
  4. gamecreator

    gamecreator Гость

    по-моему корректнее будет поменять местами содержания строк, а не издеваться над указателями.
    зы. и к чему ты продублировал код?
     
  5. Pasha

    Pasha Гость

    Для: gamecreator
    Корректнее и быстрее поменять местами указатели..
    Для: chipset
    Хочешь сохранять еще и номера строк - заведи структуру 2-х элементов - номера строки и указателя на содержимое. и сортируй не массив указателей на строчки, а массив структур.
     
  6. chipset

    chipset Гость

    спасибо ребята..учел и исправил..кому интересно вот код..

    Код (Text):
    #include <iostream>
    #include <windows.h>
    #include <cstring>
    using namespace std;
    ostream &operator<<(ostream &obj, char *strWin)
    {
    char strDos[255];
    CharToOem(strWin,strDos);
    obj.write(strDos,strlen(strDos));
    return obj;
    }

    //*********************************************************************
    //*****************************BUBBLE SORT ****************************
    //*********************************************************************
    void bubbleSort(char **a,int razm) {
    int i, j;
    char* x;

    SetConsoleTitle("**************************Bubblesort**************************");

    for( i=0; i < razm; i++) {          // i - номер прохода
    for( j = razm-1; j > i; j-- ) {  // внутренний цикл прохода
    if (strcmp(a[j-1] + 2,a[j] + 2)>0){
    x=a[j-1];
    a[j-1]=a[j];
    a[j]=x;}}}}
    // Сохранение массива слов
    void save(char **a,FILE *f){
    int j,i=0;
    char S[255];
    while(a[i]!=NULL){
    fprintf(f, "%d %s\n", *((short*)(a[i])), a[i]+2);
    i++;
    }
    }

    void main(){
    int razm =10000; // размер массива слов (массива указателей на char)
    int str_razm =512; // размер одной строки
    char **ar = new char*[razm];
    for(int i=0;i<razm;i++)
    ar[i] = NULL;
    FILE *f = fopen("1.txt","r");
    int i=0;
    char buf[128]; // под строку
    char *token; // вспомагательн для strtok в каждый указатель адрес след ликсемы слаживать
    char other[] = " -,.!)(?:\ t\n\" "; // разделители
    // пока не конец файла и не предел массива строк запоминаем строки в массив строк
    while(!feof(f) && i<razm){
    fgets(buf,128,f);
    token = strtok(buf,other);

    while(token!=NULL){// если нет след слова то 0 выход
    ar[i] = new char[54];
    strcpy(ar[i]+2,token);
    *((short*)(ar[i])) = i + 1;
    i++;
    token = strtok(NULL,other);
    }
    }

    fclose(f);

    f = fopen("2.txt","w");
    save(ar,f);
    fclose(f);
    bubbleSort (ar,i); // Сортируем
    f = fopen("3.txt","w");
    save(ar,f);
    fclose(f);

    cout<<"Нажмите для окончания ENTER!";
    getchar();
    }
     
  7. MonitoR2

    MonitoR2 Гость

    А разве метод максимального не быстрее, там хотябы сразу первый "крайний"находится на первой же внутренней петле. Конечно, сортируя 5 букавок ничего существенного, а вот если там структуры ........ штук 45 тыс .. :)

    Если будет нужен код на с/с++ или VB, пишите a_a_puchnin@mail.ru
     
Загрузка...
Похожие Темы - Сортировка пузырьком
  1. Liori
    Ответов:
    2
    Просмотров:
    1.004
  2. vera2014
    Ответов:
    0
    Просмотров:
    1.070
  3. FCDK
    Ответов:
    0
    Просмотров:
    1.263
  4. ленарано
    Ответов:
    1
    Просмотров:
    1.102
  5. Creder
    Ответов:
    0
    Просмотров:
    1.345

Поделиться этой страницей