/*
Quick sort.























*/
#include <iostream>
#include <iomanip>
#include <limits>

//using namespace std; // w starszych kompilatorach trzeba zakomentować ten wiersz

void _quick(double *T,int Lo,int Hi)
  {
   int L=Lo,H=Hi,m=(L+H)>>1;
   double Mid=T[m];
   while(true)
     {
      while((L<=Hi)&&(T[L]<Mid)) ++L;
      while((H>=Lo)&&(T[H]>Mid)) --H;
      if(L>H) break;
      if(L<H)
        {
         double Tmp=T[L];
         T[L]=T[H];
         T[H]=Tmp;
        }
      ++L;
      --H;
      if(L>H) break;
     }
   if(L<Hi) _quick(T,L,Hi);
   if(H>Lo) _quick(T,Lo,H);
  }

inline void QuickSort(double *T,unsigned Rozmiar)
  {
   _quick(T,0,Rozmiar-1);
  }

void Drukuj(const double *T,unsigned N)
  {
   unsigned i=0;
   for(const double *K=T+N;T<K;++T) cout<<"T["<<(i++)<<"]="<<*T<<';'<<endl;
  }

int main()
  {
   while(true)
     {
      unsigned Ilosc=0;
      double *T=0;
      while(true)
        {
         cout<<"Podaj liczbe nr "<<(Ilosc+1)<<" (;-koniec): ";
         double X;
         cin>>X;
         if(cin)
           {
            double *N=new double[Ilosc+1];
            if(T)
              {
               memcpy(N,T,Ilosc*sizeof(double));
               delete[] T;
              }
            T=N;
            N[Ilosc++]=X;
           }
         else
           {
            cin.clear();
            if(cin.get()==';') break;
            cout<<"Blad wprowadzania"<<endl;
           }
         cin.ignore(INT_MAX,'\n');
        }
      if(!Ilosc) break;
      cout<<endl;
      Drukuj(T,Ilosc);
      QuickSort(T,Ilosc);
      cout<<endl;
      Drukuj(T,Ilosc);
      cout<<endl<<endl;
      delete[] T;
     }
   return 0;
  }


