#include<iostream.h>

void qsort(float tablica[], unsigned poczatek, unsigned koniec);
void zamiana(float tablica[], unsigned e1, unsigned e2);
void wypisz(float tablica[], unsigned ilosc);
int main()
{
float dane[] = {0.0f, 12.5f, 7.0f, 13.33f, 25.23f, 10.0f, 9.99f, 0.25f, 0.98f, 1.01f};
cout<<"Program posortuje tablice z danymi metoda \"quicksort\""<<endl;
cout<<"Przed sortowaniem tablica zawiera dane:"<<endl;
wypisz(dane, 10);
cout<<endl;
cout<<endl<<"Sortujemy tablice. Tablica zawiera obecnie dane:"<<endl;
///wywołanie metody
wypisz(dane, 10); 
cout<<endl;
return 0;
}


void qsort(float tablica[], unsigned poczatek, unsigned koniec)
{
// Jesli tablica ma wiecej niz jeden element
if( poczatek<koniec )
{
unsigned granica, // pokazuje pierwszy element "duzy" w tablicy
indeks; // sluzy do przegladania tablicy
// Dokonanie przeniesienia elementow "duzych" i "malych" do odpowiednich miejsc
// Element osiowy umieszczamy w poczatkowej komorce
// wybor: os przypada w srodku tablicy
zamiana(tablica, poczatek, (poczatek+koniec)/2);
// Elementy "duze" nie wczesniej jak w drugim elemencie zakresu tablicy
granica = poczatek+1;

// Wyszukujemy pierwszy element "duzy"
while( (granica<=koniec)&&(tablica[granica]<=tablica[poczatek]) )
granica++;
indeks = granica+1;
while(indeks<=koniec)
{
	if( tablica[indeks]<=tablica[poczatek] )
	{
		// Dopisz znaleziony do elementow "malych"
		zamiana(tablica, granica, indeks);
		granica++;
		// Przejdz na nastepny element przegladany
		indeks++;
	}
	// , a jesli tablica[indeks] > tablica[poczatek]
	else 
		indeks++;
	}
		// Umiesc zapamietany element osiowy jako ostatni z "malych"
		// Jesli elementow "malych" jest wiecej niz 1, zamien
		// (jesli jest tylko jeden, jest to wlasnie element osiowy)
	if( granica-1>poczatek ) 
		zamiana(tablica, poczatek, granica-1);
		// Rekurencyjne wywolanie dla obu czesci tablicy (bez elementu osiowego)
		// Jesli "malych" elementow jest co najmniej 3 (osiowy bedzie pominiety)
		// wywolaj qsort dla elementow "malych" bez osiowego
	if( granica-poczatek >= 3) 
		qsort(tablica, poczatek, granica-2);
		// Jesli "duzych" elementow jest co najmniej dwa
		// wywolaj qsort dla elementow "duzych"
	if( koniec-granica >= 2) 
			qsort(tablica, granica, koniec);
}
}


void zamiana(float tablica[], unsigned e1, unsigned e2)
{
//uzupełnić
}


void wypisz(float tablica[], unsigned ilosc)
{
unsigned indeks;
for(indeks=0; indeks<ilosc; indeks++) cout<< tablica[indeks] <<" ";

}
