#include <iostream>
#include <fstream>
#include <string>
using namespace std;
int ifun_FindNextR(int iL, int iSize, long int *liTab);
int ifun_Partition(int iL, int iR, long int *liTab);
void vfun_QuickSort(int iSize, long int *liTab);
void vfun_SaveToFile(string sName, int iSize, long int *liTab);
bool bfun_OpenFile(string &sName, ifstream &fsFile);
int main() {
string sName;
ifstream fsFile;
int iSetsNumber, iJ = 0, iNumbersInSet;
do {
cin >> sName;
} while (!bfun_OpenFile(sName, fsFile));
fsFile >> iSetsNumber;
while (iJ < iSetsNumber) {
fsFile >> iNumbersInSet;
long int *liTab = new long int[iNumbersInSet];
for (int i = 0; i < iNumbersInSet; i++) {
fsFile >> liTab[i];
}
vfun_QuickSort(iNumbersInSet, liTab);
vfun_SaveToFile("wynik.txt", iNumbersInSet, liTab);
delete [] liTab;
iJ++;
}
fsFile.close();
return 0;
}
/**
*
* @param iL
* @param iSize
* @param liTab
* @return iSize-1
*/
int ifun_FindNextR(int iL, int iSize, long int *liTab) {
for (int iI = iL; iI < iSize; iI++) {
if (liTab[iI] < 0)
return iI;
}
return iSize - 1;
}
/**
*
* @param iL
* @param iR
* @param liTab
* @return iL
*/
int ifun_Partition(int iL, int iR, long int *liTab) {
long lPivot = liTab[(iL + iR) / 2];
while (iL <= iR) {
while (liTab[iR] > lPivot) {
iR--;
}
while (liTab[iL] < lPivot) {
iL++;
}
if (iL <= iR) {
long lTmp = liTab[iR];
liTab[iR] = liTab[iL];
liTab[iL] = lTmp;
iL++;
iR--;
}
}
return iL;
}
/**
*
* @param iSize
* @param liTab
*/
void vfun_QuickSort(int iSize, long int *liTab) {
int iL = 0;
int iR = iSize - 1;
int iQ, iI = 0;
int iTemp = iR;
while (true) {
iI--;
while (iL < iTemp) {
iQ = ifun_Partition(iL, iTemp, liTab);
liTab[iTemp] = -liTab[iTemp];
iTemp = iQ - 1;
++iI;
}
if (iI < 0) {
break;
}
iL++;
iTemp = ifun_FindNextR(iL, iSize, liTab);
liTab[iTemp] = -liTab[iTemp];
}
}
/**
* Zapis do pliku
* @param sName nazwa pliku tekstowego
* @param iSize eozmiar tablicy z ktorej zczytujemmy elementy
* @param liArr tablica z elementami
*/
void vfun_SaveToFile(string sName, int iSize, long int *liTab) {
ofstream outFile;
outFile.open(sName, ios::app);
outFile << endl;
for (int i = 0; i < iSize; i++) {
outFile << liTab[i];
}
outFile.close();
}
/**
* Szukanie pliku, sprawdzanie czy jest z rozszerzeniem .txt, dopisywaie .txt
* @param sName oryginalna nazwa pliku tekstowego
* @param fsFile nazwa którą nadaliśmy plikowi
* @return true gdy znaleziono plik
* @return false gdy nie znaleziono pliku
*/
bool bfun_OpenFile(string &sName, ifstream &fsFile) {
try {
if (sName.find(".txt") != string::npos) {
fsFile.open(sName.c_str());
}
else {
sName += ".txt";
fsFile.open(sName.c_str());
}
if (!fsFile) {
throw "!";
}
}
catch (char *cError) {
fsFile.clear();
cout << cError;
return false;
}
return true;
}