Advertisement
Solingen

no_stable_fast_sort

Dec 11th, 2024
16
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.71 KB | None | 0 0
  1. #include <fstream>
  2. #include <ctime>
  3. #include "string.h"
  4. #include "array.h"
  5.  
  6. using namespace std;
  7.  
  8. struct item
  9. {
  10.     int index;
  11.     int data;
  12.  
  13.     bool operator<(const item& other) const
  14.     {
  15.         return data < other.data;// || (data == other.data && index < other.index);
  16.     }
  17.  
  18.     bool operator>(const item& other) const
  19.     {
  20.         return data > other.data;// || (data == other.data && index > other.index);
  21.     }
  22. };
  23.  
  24. istream& operator>>(std::istream& in, item& item)
  25. {   in >> item.data;
  26.     return in;
  27. }
  28. ostream& operator<<(std::ostream& out, item item)
  29. { out << "[" << item.index << "] " << item.data;
  30.     return out;
  31. }
  32.  
  33. template <typename T>
  34. void swap(T& a, T& b)
  35. {
  36.     T temp = a;
  37.     a = b;
  38.     b = temp;
  39. }
  40.  
  41.  
  42. template <typename T>
  43. int partition(Array<T>& arr, int low, int high, bool (*cmp)(T a, T b))
  44. {
  45.     T pivot = arr[low];
  46.     int i = low - 1;
  47.     int j = high + 1;
  48.  
  49.     while (true)
  50.     {
  51.        
  52.         do
  53.         {
  54.             i++;
  55.         } while ((cmp(arr[i], pivot)));
  56.  
  57.         do
  58.         {
  59.             j--;
  60.         } while ((cmp(pivot, arr[j])));
  61.  
  62.  
  63.         if (i >= j)
  64.         {
  65.             return j;
  66.         }
  67.  
  68.         ::swap(arr[i], arr[j]);
  69.     }
  70. }
  71.  
  72. template <typename T>
  73. void quicksort(Array<T>& arr, int low, int high, bool (*cmp)(T a, T b))
  74. {
  75.     if (low < high)
  76.     {
  77.         int pi = partition(arr, low, high, cmp);
  78.         quicksort(arr, low, pi, cmp);
  79.         quicksort(arr, pi + 1, high, cmp);
  80.     }
  81. }
  82.  
  83. template <typename T>
  84. bool Asc(T a, T b)
  85. {
  86.     return a < b;
  87. }
  88.  
  89. template <typename T>
  90. bool Desc(T a, T b)
  91. {
  92.     return a > b;
  93. }
  94.  
  95. template <typename T>
  96. void sort(Array<T>& arr, bool asc)
  97. {
  98.     quicksort(arr, 0, arr.size() - 1, asc ? Asc<T> : Desc<T> );
  99. }
  100.  
  101. template <typename T>
  102. Array<T> load_array(const String& filename)
  103. {
  104.     Array<T> arr;
  105.     ifstream in(filename.str);
  106.     if (!in)
  107.     {
  108.         cerr << "Error: File not found - " << filename.str << endl;
  109.         exit(1);
  110.     }
  111.  
  112.     T value;
  113.     while (in >> value)
  114.     {
  115.         value.index = arr.size();
  116.         arr.append(value);
  117.     }
  118.  
  119.     return arr;
  120. }
  121.  
  122.  
  123.  
  124. template <typename T>
  125. void print_array(const Array<T>& arr)
  126. {
  127.     for (int i = 0; i < arr.size(); i++)
  128.     {
  129.         if (i > 0) cout << " ";
  130.         cout << arr[i];
  131.     }
  132.     cout << endl;
  133. }
  134.  
  135. template <typename T>
  136. bool is_sorted(const Array<T>& arr, bool asc)
  137. {
  138.     for (int i = 1; i < arr.size(); i++)
  139.     {
  140.         if ((asc && arr[i] < arr[i - 1]) || (!asc && arr[i] > arr[i - 1]))
  141.         {
  142.             return false;
  143.         }
  144.         if (arr[i].data == arr[i - 1].data && arr[i].index < arr[i - 1].index)
  145.         {
  146.             cout << "По индексу:" << arr[i].data << "  Лежит:" << arr[i-1] << "  Должно:" << arr[i] << endl;
  147.             return false;
  148.         }
  149.     }
  150.     return true;
  151. }
  152.  
  153. int main(int argc, char* argv[])
  154. {
  155.     if (argc < 2)
  156.     {
  157.         cerr << "Usage: fastsort file [asc|desc] [-o] [-v]" << endl;
  158.         return 1;
  159.     }
  160.  
  161.     String filename = argv[1];
  162.     bool asc = true;
  163.     bool verbose = false;
  164.     String outputFile;
  165.  
  166.     for (int i = 2; i < argc; i++)
  167.     {
  168.         if (String(argv[i]) == "desc")
  169.         {
  170.             asc = false;
  171.         } else if (String(argv[i]) == "asc")
  172.         {
  173.             asc = true;
  174.         } else if (String(argv[i]) == "-o" && i + 1 < argc)
  175.         {
  176.             outputFile = argv[++i];
  177.         } else if (String(argv[i]) == "-v")
  178.         {
  179.             verbose = true;
  180.         } else
  181.         {
  182.             cerr << "Error: Unknown option - " << argv[i] << endl;
  183.             return 1;
  184.         }
  185.     }
  186.  
  187.     clock_t startTime = clock();
  188.     Array<item> arr = load_array<item>(filename);
  189.     clock_t loadTime = clock() - startTime;
  190.  
  191.     startTime = clock();
  192.     sort(arr, asc);
  193.     clock_t sortTime = clock() - startTime;
  194.  
  195.  
  196.     if (!is_sorted(arr, asc))
  197.     {
  198.         print_array(arr);
  199.         return 1;
  200.     }
  201.     if (outputFile.length() > 0)
  202.     {
  203.         ofstream out(outputFile.str);
  204.         if (!out)
  205.         {
  206.             cerr << "Error: Failed to open output file - " << outputFile.str << endl;
  207.             return 1;
  208.         }
  209.         for (int i = 0; i < arr.size(); i++)
  210.         {
  211.             out << arr[i].data << " ";
  212.         }
  213.         out << endl;
  214.     } else
  215.     {
  216.         print_array(arr);
  217.     }
  218.  
  219.     if (verbose)
  220.     {
  221.         cout << "Load time: " << static_cast<double>(loadTime) / CLOCKS_PER_SEC << " sec" << endl;
  222.         cout << "Sort time: " << static_cast<double>(sortTime) / CLOCKS_PER_SEC << " sec" << endl;
  223.         cout << "Memory used: " << arr.size() * sizeof(item) / 1024.0 << " KB" << endl;
  224.     }
  225.  
  226.     return 0;
  227. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement