#include #include #include 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; }