Перейти к содержанию
СофтФорум - всё о компьютерах и не только

Методы сортировки в С++


Рекомендуемые сообщения

Имеется структура вида {char, char, char, char, char} и массив структур. Пользователь вводит несколько записей. Необходимо эти записи сохранить в файл, а также при нажатии конкретной цифры прочитать из файла и вывести на экран. Как это сделать.

И самое главное, напишите на примере структуры, как осуществить сортировку методом бинарных включений и методом быстрой сортировки. Заранее спасибо!

Ссылка на комментарий
Поделиться на другие сайты

  • 2 недели спустя...

Вот пример моей программы. Правда здесь немного другое. Но суть та же. И еще добавлен метод простого обмена (пузырек). Сортировка ведется по двум полям. Возможно это не лучший вариант, но думаю для новичка нормально.

#include <iostream.h>#include <conio.h>#include <iomanip.h>#include <stdio.h>#include <string.h>//=============== Объявление структуры и переменных ===============struct Tabl  {  char FIO[15];  char MarcAvto[15];  short NomDvig;  char Cvet[10];  char Adres[15];  };Tabl Reg[100], Reg2;int i, j, number1, Zap;FILE *f;// ================ Объявление функций ==============void InOut();//void SortBinVkl();void SortPrObmena();void QuickSortFIO(int l, int r);void QuickSortNDvig(int l, int r);void BinInsert ();// ================ Главная функция ===================void main(){//int number1;cout << "\n1 - Vvod novih zapisey" << endl << "2 - Chtenie iz faila" << endl << "3 - Sortirovka binarnimi vklucheniami" <<endl << "4 - Sortirovka prostim obmenom" << endl << "5 - Bistraia sortirovka" << endl << "-------------------------------------" << endl << "0 - Exit\n" << endl;do{cin >> number1;if (number1 == 1) InOut();if (number1 == 2)  {  cout << "\n" << setw(16) << "FIO vladelca" << setw(13) << "Marca avto" << setw(19) << "Nomer dvigatelia" << setw(10) << "Cvet" << setw(15) << "Adres" << endl;  Zap=0;  f=fopen("Base.dat", "r");  while (!feof(f))  {  fread(&Reg[i], sizeof(Tabl),1,f);  cout << "\n" << setw(16) << Reg[i].FIO << setw(13) << Reg[i].MarcAvto	   << setw(19) << Reg[i].NomDvig << setw(10) << Reg[i].Cvet	   << setw(15) << Reg[i].Adres;  i++;  Zap++;  }  cout << "\n";  }if (number1 == 3) BinInsert ();if (number1 == 4) SortPrObmena();if (number1 == 5)  {  int l=0, r=Zap;  int number3;  cout << "\n1 - sortirovka po polu FIO\n"	<< "2 - sortirovka po polu nomer dvigatelia" << endl;  cin >> number3;  if (number3 == 1)  {  QuickSortFIO(l, r-1);  cout << "\n" << setw(16) << "FIO vladelca" << setw(13) << "Marca avto"	   << setw(19) << "Nomer dvigatelia" << setw(10) << "Cvet"	   << setw(15) << "Adres" << endl;  for (int i=0; i<Zap; i++)	   cout << "\n" << setw(16) << Reg[i].FIO << setw(13) << Reg[i].MarcAvto	   << setw(19) << Reg[i].NomDvig << setw(10) << Reg[i].Cvet	   << setw(15) << Reg[i].Adres;  cout << endl;  }  if (number3 == 2)  {  QuickSortNDvig(l, r-1);  cout << "\n" << setw(16) << "FIO vladelca" << setw(13) << "Marca avto"	   << setw(19) << "Nomer dvigatelia" << setw(10) << "Cvet"	   << setw(15) << "Adres" << endl;  for (int i=0; i<Zap; i++)  cout << "\n" << setw(16) << Reg[i].FIO << setw(13) << Reg[i].MarcAvto	   << setw(19) << Reg[i].NomDvig << setw(10) << Reg[i].Cvet	   << setw(15) << Reg[i].Adres;  cout << endl;   }  }}while (number1 != 0);fclose(f);}// ============= Функция ввода ввывода ==============void InOut(){cout << "\nVvedite kolicestvo vvodimih zapisei" << endl;cin >> Zap;for (i=0; i<Zap; i++){cout << "Vvedite FIO   ";cin >> Reg[i].FIO;cout << "Vvedite marku avtomobilia   ";cin >> Reg[i].MarcAvto;cout << "Vvedite nomer dvigatelia   ";cin >> Reg[i].NomDvig;cout << "Vvedite cvet avtomobilia   ";cin >> Reg[i].Cvet;cout << "Vvedite adres vladelca   ";cin >> Reg[i].Adres;}cout << "\n" << setw(16) << "FIO vladelca" << setw(13) << "Marca avto" << setw(19) << "Nomer dvigatelia" << setw(10) << "Cvet" << setw(15) << "Adres" << endl;f=fopen("Base.dat", "wb");for (i=0; i<Zap; i++)  {  cout << "\n" << setw(16) << Reg[i].FIO << setw(13) << Reg[i].MarcAvto	<< setw(19) << Reg[i].NomDvig << setw(10) << Reg[i].Cvet	<< setw(15) << Reg[i].Adres; fwrite(&Reg[i], sizeof(Tabl),1,f);  }fclose(f);cout << "\n";}// ============ Сортировка простым обменом (пузырек) ===============void SortPrObmena(){int number2;cout << "\n1 - sortirovka po polu FIO\n" << "2 - sortirovka po polu nomer dvigatelia" << endl;cin >> number2;if (number2 == 1)  {  for (int j=1; j<Zap; j++)  for (int i=0; i<Zap-j; i++)	 {	 if (Reg[i].FIO[0] > Reg[i+1].FIO[0])		{		Reg2 = Reg[i];		Reg[i] = Reg[i+1];		Reg[i+1] = Reg2;		}	 }  cout << "\n" << setw(16) << "FIO vladelca" << setw(13) << "Marca avto"	<< setw(19) << "Nomer dvigatelia" << setw(10) << "Cvet"	<< setw(15) << "Adres" << endl;  for (int i=0; i<Zap; i++)  cout << "\n" << setw(16) << Reg[i].FIO << setw(13) << Reg[i].MarcAvto	<< setw(19) << Reg[i].NomDvig << setw(10) << Reg[i].Cvet	<< setw(15) << Reg[i].Adres;  cout << "\n";  }if (number2 == 2)  {  for (int j=1; j<Zap; j++)  for (int i=0; i<Zap-j; i++)	 {	 if (Reg[i].NomDvig > Reg[i+1].NomDvig)		{		Reg2 = Reg[i];		Reg[i] = Reg[i+1];		Reg[i+1] = Reg2;		}	 }  cout << "\n" << setw(16) << "FIO vladelca" << setw(13) << "Marca avto"	<< setw(19) << "Nomer dvigatelia" << setw(10) << "Cvet"	<< setw(15) << "Adres" << endl;  for (int i=0; i<Zap; i++)  cout << "\n" << setw(16) << Reg[i].FIO << setw(13) << Reg[i].MarcAvto	<< setw(19) << Reg[i].NomDvig << setw(10) << Reg[i].Cvet	<< setw(15) << Reg[i].Adres;  cout << "\n";  }}// ============ быстрая сортировка (по полю FIO) ================void QuickSortFIO(int l, int r ){int i = l;int j = r;int center = (r+l)/2;do{while (Reg[center].FIO[0] > Reg[i].FIO[0])  {i++;}while (Reg[center].FIO[0] < Reg[j].FIO[0]){   j--;  }if (i<=j)  {  Reg2=Reg[i];  Reg[i]=Reg[j];  Reg[j]=Reg2;i++;j--;}}while (i<=j);if (i<r) QuickSortFIO(l,i-1);if (j>l) QuickSortFIO(j+1,r);}// ============== быстрая сортировка (по полю NomDvig) ==============void QuickSortNDvig(int l, int r ){int i = l;int j = r;int center = (r+l)/2;do{while (Reg[center].NomDvig > Reg[i].NomDvig)  {i++;}while (Reg[center].NomDvig < Reg[j].NomDvig){   j--;  }if (i<=j)  {  Reg2=Reg[i];  Reg[i]=Reg[j];  Reg[j]=Reg2;i++;j--;}}while (i<=j);if (i<r) QuickSortNDvig(l,i);if (j>l) QuickSortNDvig(j,r);}// ============= Сортировка бинарными включениями ==============void BinInsert (){int l, r, j;int i;int center;int number4;cout << "\n1 - sortirovka po polu FIO\n" << "2 - sortirovka po polu nomer dvigatelia" << endl;cin >> number4;if (number4 == 1)  {  for (int i=2; i<Zap; i++)  {  l=1;  r=i-1;  center = (l+r)/2;  while (l != center)	 {	 if (Reg[center-1].FIO[0] >Reg[i-1].FIO[0])		{		r = center;		}	 else		l = center;	 center = (l+r)/2;	 }  if (Reg[l-1].FIO[0] <Reg[i-1].FIO[0])	 {	 if (Reg[i-1].FIO[0] >Reg[r-1].FIO[0])		l=r+1;	 else		l=r;	 }  j=i;  Reg2 = Reg[i-1];  while (j>l)	 {	 Reg[j-1] = Reg[j-1-1];	 j--;	 }  Reg[l-1]=Reg2;  }  cout << "\n" << setw(16) << "FIO vladelca" << setw(13) << "Marca avto"	<< setw(19) << "Nomer dvigatelia" << setw(10) << "Cvet"	<< setw(15) << "Adres" << endl;  for (int i=0; i<Zap; i++)  cout << "\n" << setw(16) << Reg[i].FIO << setw(13) << Reg[i].MarcAvto	   << setw(19) << Reg[i].NomDvig << setw(10) << Reg[i].Cvet	   << setw(15) << Reg[i].Adres;  cout << "\n";  }if (number4 == 2)  {  for (int i=2; i<Zap; i++)  {  l=1;  r=i-1;  center = (l+r)/2;  while (l != center)	 {	 if (Reg[center-1].NomDvig >Reg[i-1].NomDvig)		{		r = center;		}	 else		l = center;	 center = (l+r)/2;	 }  if (Reg[l-1].NomDvig <Reg[i-1].NomDvig)	 {	 if (Reg[i-1].NomDvig >Reg[r-1].NomDvig)		l=r+1;	 else		l=r;	 }  j=i;  Reg2 = Reg[i-1];  while (j>l)	 {	 Reg[j-1] = Reg[j-1-1];	 j--;	 }  Reg[l-1]=Reg2;  }  cout << "\n" << setw(16) << "FIO vladelca" << setw(13) << "Marca avto"	<< setw(19) << "Nomer dvigatelia" << setw(10) << "Cvet"	<< setw(15) << "Adres" << endl;  for (int i=0; i<Zap; i++)  cout << "\n" << setw(16) << Reg[i].FIO << setw(13) << Reg[i].MarcAvto	   << setw(19) << Reg[i].NomDvig << setw(10) << Reg[i].Cvet	   << setw(15) << Reg[i].Adres;  cout << "\n";  }}

Надеюсь кому нибудь пригодится.

Если есть какие либо замечания, готов выслушать. Ну а так в общем, тема закрыта.

PS: как уменьшить размер окна кода?

Ссылка на комментарий
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...