QuickSort

 avatar
unknown
c_cpp
3 years ago
2.1 kB
4
Indexable
#include<fstream>
#include <string.h>
#include<iostream>
using namespace std;


struct TOsoba
{
	long datum;
	char meno[16], priezvisko[16], adresa[31];
};



//Porovnavacia funkcia dvoch pacientov ulozenych v strukturovych premennych, ktora je pouzita vo 
//funkcii ‘QuickSort’. 
//Funkcia ‘PorovnajOsoby’ porovna dvoch pacientov najskor podla ich priezvisk, ak ich maju zhodne, 
//tak potom podla ich mien, ak aj tie maju zhodne tak ich potom porovna podla datumov ich vysetreni.
int PorovnajOsoby(TOsoba *o1, TOsoba *o2)
{
	int porovnanie = strcmp(o1->priezvisko, o2->priezvisko);
	if (porovnanie != 0) 
		return porovnanie;
	porovnanie = strcmp(o1->meno, o2->meno);
	if (porovnanie != 0) 
		return porovnanie;
	if (o1->datum < o2->datum) 
		return -1;
	if (o1->datum > o2->datum) 
		return 1;
	
	return 0;
}

void QuickSort(TOsoba **pole, long lavy, long pravy)
{
  if(lavy < pravy)
  {
		long a = lavy, b = pravy;
		TOsoba *stredny_prvok = pole[(lavy + pravy) / 2];
		do
		{
			while (PorovnajOsoby(pole[a], stredny_prvok) < 0) a++;
			while (PorovnajOsoby(stredny_prvok, pole[b]) < 0) b--;
			if (a <= b)
			{
				TOsoba *t = pole[a];
				pole[a] = pole[b];
				pole[b] = t;
				a++; b--;
			}
		}while (a <= b);
		QuickSort(pole, lavy, b);
		QuickSort(pole, a, pravy);
  } 
}

int main()
{
	TOsoba **osoby = new TOsoba*[1000];
	int i = 0, pocet;
	ifstream in;

	in.open("pacienti.txt");
	if( !in )
	{
		cout<<"Subor sa nepodarilo otvorit";
		return 0;
	}

	while( !in.eof() )
	{
		osoby[i] = new TOsoba;
		in >> osoby[i]->datum >> osoby[i]->meno >> osoby[i]->priezvisko;
		in.getline(osoby[i]->adresa, 30);
		i++;
	}
	
	pocet = i-1;
	cout << "v zozname " << (2 <= pocet && pocet <= 4 ? "su " : "je ");
	cout << pocet << " vysetrenia nasledovnych pacientov";
	cout << ":\n";
	QuickSort(osoby, 0, pocet - 1);
	for (i = 0; i < pocet; i++)
	{
		cout << osoby[i]->datum << ' ' << osoby[i]->meno << ' '
		<< osoby[i]->priezvisko << osoby[i]->adresa << endl;
		delete osoby[i];
	}
	delete osoby[pocet];
	delete[] osoby;

	return 0;
}
Editor is loading...