Advertisement
sooobus

EXTSort

Oct 4th, 2015
65
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.10 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <string>
  4. #include <fstream>
  5.  
  6. using namespace std;
  7.  
  8. class CPairHeap{
  9.     public:
  10.     std::vector< pair<int, int> > storage;
  11.     CPairHeap(){};
  12.     ~CPairHeap(){ storage.clear(); }
  13.  
  14.     void add(pair <int, int> el){
  15.         storage.push_back(el);
  16. //        sift_up();
  17.     }
  18.  
  19.     pair<int, int> get_min(){
  20.         pair <int, int> ans = storage[0];
  21.         swap(storage[0], storage[storage.size() - 1]);
  22.         sift_down();
  23.         return ans;
  24.     }
  25.  
  26.     private:
  27.  
  28.     void sift_down(){
  29.         int fin = storage.size() - 1;
  30.         int root = 0;
  31.  
  32.         int child = 0;
  33.         while((child = root * 2 + 1) <= fin){
  34.             if(child + 1 <= fin && storage[child] < storage[child + 1])
  35.                 child++;
  36.             if(storage[root] < storage[child]){
  37.                 swap(storage[root], storage[child]);
  38.                 root = child;
  39.             }
  40.             else{
  41.                 return;
  42.             }
  43.         }
  44.     }
  45. };
  46.  
  47. class CPriority_Queue{
  48.     public:
  49.     CPairHeap heap;
  50.     CPriority_Queue(){}
  51.  
  52.     pair<int, int> get_min(){
  53.         return heap.get_min();
  54.     }
  55.  
  56.     void add(pair<int, int> el){
  57.         heap.add(el);
  58.     }
  59. };
  60.  
  61. class CFileReader{ //reading file
  62.     private:
  63.     ifstream* input;
  64.  
  65.     public:
  66.     CFileReader(string fname){ input = new ifstream(fname); }
  67.     CFileReader();
  68.     ~CFileReader(){ input->close(); }
  69.  
  70.     int get(){
  71.         int a;
  72.         *input >> a;
  73.         return a;
  74.     }
  75.  
  76.     bool can_read(){
  77.         return !(input->eof());
  78.     }
  79. };
  80.  
  81. class CFileWriter{ //writing file
  82.     private:
  83.     ofstream* output;
  84.  
  85.  
  86.     public:
  87.     CFileWriter();
  88.     CFileWriter(string fname){ output = new ofstream(fname); }
  89.     ~CFileWriter(){ output->close();}
  90.  
  91.     void write(int n){
  92.         *output << n;
  93.     }
  94. };
  95.  
  96. class CSortedListFromFile
  97. {
  98.     private:
  99.     CFileReader input("inp.txt");
  100.     size_t lim = 10000;
  101.     vector <int> buff();
  102.     string buff_prefix = "to_merge_";
  103.     size_t files_num = 0;
  104.  
  105.     public:
  106.     CSortedListFromFile();
  107.     ~CSortedListFromFile();
  108.  
  109.     void write_sorted_buff(){
  110.         CFileWriter writer(buff_prefix + files_num);
  111.         for(size_t i = 0; i < buff.size(); i++){
  112.             writer.write(buff[i]);
  113.             writer.write('\n');
  114.         }
  115.         files_num++;
  116.     }
  117.  
  118.     void process_input(){
  119.         size_t i = 0;
  120.         while(input.can_read()){
  121.             if(i >= lim){
  122.                 merge_sort(buff);
  123.                 write_sorted_buff();
  124.                 clear(buff);
  125.                 i = 0;
  126.             }
  127.             buff.push_back(input.get());
  128.             i++;
  129.         }
  130.     }
  131.  
  132.     void do_all_this_merge_stuff(){
  133.         CPriority_Queue prior_q();
  134.         vector <CFileReader()> streams;
  135.  
  136.         for(size_t i = 0; i < files_num; i++){
  137.             streams.push_back(CFileReader(buff_prefix + i));
  138.         }
  139.         for(size_t i = 0; i < streams.size(); i++){
  140.             prior_q.add(pair<streams[i].get(), i>);
  141.         }
  142.  
  143.  
  144.     }
  145. };
  146. int main()
  147. {
  148.     cout << "Hello world!" << endl;
  149.     return 0;
  150. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement