Jump to content
СофтФорум - всё о компьютерах и не только

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


Recommended Posts

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

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

Link to comment
Share on other sites

  • 2 weeks later...

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

#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: как уменьшить размер окна кода?

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...