Facebook
From Crimson Porcupine, 6 Years ago, written in C++.
Embed
Download Paste or View Raw
Hits: 274
  1. #include <iostream>
  2. #include <fstream>
  3. #include <string>
  4.  
  5. using namespace std;
  6.  
  7. int ifun_FindNextR(int iL, int iSize, long int *liTab);
  8. int ifun_Partition(int iL, int iR, long int *liTab);
  9. void vfun_QuickSort(int iSize, long int *liTab);
  10. void vfun_SaveToFile(string sName, int iSize, long int *liTab);
  11. bool bfun_OpenFile(string &sName, ifstream &fsFile);
  12.  
  13. int main() {
  14.         string sName;
  15.         ifstream fsFile;
  16.         int iSetsNumber, iJ = 0, iNumbersInSet;
  17.  
  18.         do {
  19.                 cin >> sName;
  20.         } while (!bfun_OpenFile(sName, fsFile));
  21.  
  22.         fsFile >> iSetsNumber;
  23.  
  24.         while (iJ < iSetsNumber) {
  25.                 fsFile >> iNumbersInSet;
  26.                 long int *liTab = new long int[iNumbersInSet];
  27.        
  28.                 for (int i = 0; i < iNumbersInSet; i++) {
  29.                         fsFile >> liTab[i];
  30.                 }
  31.  
  32.                 vfun_QuickSort(iNumbersInSet, liTab);
  33.                 vfun_SaveToFile("wynik.txt", iNumbersInSet, liTab);
  34.                 delete [] liTab;
  35.                 iJ++;
  36.         }
  37.  
  38.         fsFile.close();
  39.         return 0;
  40. }
  41.  
  42. /**
  43. *
  44. * @param iL
  45. * @param iSize
  46. * @param liTab
  47. * @return iSize-1
  48. */
  49. int ifun_FindNextR(int iL, int iSize, long int *liTab) {
  50.         for (int iI = iL; iI < iSize; iI++) {
  51.                 if (liTab[iI] < 0)
  52.                         return iI;
  53.         }
  54.  
  55.         return iSize - 1;
  56. }
  57.  
  58. /**
  59. *
  60. * @param iL
  61. * @param iR
  62. * @param liTab
  63. * @return iL
  64. */
  65. int ifun_Partition(int iL, int iR, long int *liTab) {
  66.         long lPivot = liTab[(iL + iR) / 2];
  67.         while (iL <= iR) {
  68.                 while (liTab[iR] > lPivot) {
  69.                         iR--;
  70.                 }
  71.  
  72.                 while (liTab[iL] < lPivot) {
  73.                         iL++;
  74.                 }
  75.  
  76.                 if (iL <= iR) {
  77.                         long lTmp = liTab[iR];
  78.                         liTab[iR] = liTab[iL];
  79.                         liTab[iL] = lTmp;
  80.                         iL++;
  81.                         iR--;
  82.                 }
  83.         }
  84.  
  85.         return iL;
  86. }
  87.  
  88.  /**
  89.  *
  90.  * @param iSize
  91.  * @param liTab
  92.  */
  93. void vfun_QuickSort(int iSize, long int *liTab) {
  94.         int iL = 0;
  95.         int iR = iSize - 1;
  96.         int iQ, iI = 0;
  97.         int iTemp = iR;
  98.  
  99.         while (true) {
  100.                 iI--;
  101.  
  102.                 while (iL < iTemp) {
  103.                         iQ = ifun_Partition(iL, iTemp, liTab);
  104.                         liTab[iTemp] = -liTab[iTemp];
  105.                         iTemp = iQ - 1;
  106.                         ++iI;
  107.                 }
  108.  
  109.                 if (iI < 0) {
  110.                         break;
  111.                 }
  112.  
  113.                 iL++;
  114.                 iTemp = ifun_FindNextR(iL, iSize, liTab);
  115.                 liTab[iTemp] = -liTab[iTemp];
  116.         }
  117. }
  118.  
  119. /**
  120. * Zapis do pliku
  121. * @param sName  nazwa pliku tekstowego
  122. * @param iSize eozmiar tablicy z ktorej zczytujemmy elementy
  123. * @param liArr tablica z elementami
  124. */
  125. void vfun_SaveToFile(string sName, int iSize, long int *liTab) {
  126.         ofstream outFile;
  127.         outFile.open(sName, ios::app);
  128.         outFile << endl;
  129.         for (int i = 0; i < iSize; i++) {
  130.                 outFile << liTab[i];
  131.         }
  132.         outFile.close();
  133. }
  134.  
  135. /**
  136. * Szukanie pliku, sprawdzanie czy jest z rozszerzeniem .txt, dopisywaie .txt
  137. * @param sName oryginalna nazwa pliku tekstowego
  138. * @param fsFile nazwa którą nadaliśmy plikowi
  139. * @return true gdy znaleziono plik
  140. * @return false gdy nie znaleziono pliku
  141. */
  142. bool bfun_OpenFile(string &sName, ifstream &fsFile) {
  143.         try {
  144.                 if (sName.find(".txt") != string::npos) {
  145.                         fsFile.open(sName.c_str());
  146.                 }
  147.                 else {
  148.                         sName += ".txt";
  149.                         fsFile.open(sName.c_str());
  150.                 }
  151.  
  152.                 if (!fsFile) {
  153.                         throw "!";
  154.                 }
  155.         }
  156.         catch (char *cError) {
  157.                 fsFile.clear();
  158.                 cout << cError;
  159.                 return false;
  160.         }
  161.  
  162.         return true;
  163. }
  164.