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

  • Автор темы chipset
  • Дата начала
C

chipset

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

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

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

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


Код:
$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;

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

chipset

#3
ну знаком..а што ты этим хотел сказать?..
Код:
x=a[j-1];
a[j-1]=a[j];
a[j]=x;
 
G

gamecreator

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

Pasha

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

chipset

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

Код:
#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();
}
 
M

MonitoR2

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

Если будет нужен код на с/с++ или VB, пишите a_a_puchnin@mail.ru