#include #include #include #include #define LENGHT_STRING 255 using namespace std; int rand_gen(int size){ return rand()%size; } class Key{ int key1; unsigned char key2; public: Key(){ key1=0; key2=0; } Key(Key* a_key){ key1=a_key->key1; key2=a_key->key2; } Key(int a_key1, char a_key2){ key1=a_key1; key2=a_key2; } friend ostream &operator<<(ostream &stream, Key key); friend int operator<(Key key1, Key key2); Key operator++(int i){ key2-=97; key2++; if(key2/26){ key1++; key2=0; } key2+=97; return *this; } Key operator=(Key op2){ key1=op2.key1; key2=op2.key2; return *this; } Key operator=(Key *op2){ key1=op2->key1; key2=op2->key2; return *this; } }; ostream &operator<<(ostream &stream, Key key){ stream< rows; void Add(char* str){ Key *last_key; last_key = new Key(); if(rows.size()){ Row* last_row=rows.back(); last_key=new Key(last_row->key); } (*last_key)++; rows.push_back(new Row(last_key,str)); } void LoadFromFile(char* filename){ int i,x,y,h,w; double re,im; ifstream in(filename); if(!in) exit(1); while(in){ char *str= new char[LENGHT_STRING]; in.getline(str,LENGHT_STRING); Add(str); } } public: Table(char* filename){ rows.clear(); LoadFromFile(filename); } void merge(int lb, int split, int ub){ list::iterator left_i=rows.begin(); list::iterator right_i=rows.begin(); int left=lb; int right=split; for(int i=0;i::iterator initial_left = left_i; list::iterator initial_right = right_i; list temp; list::iterator temp_i=temp.begin(); while(left1) { split = (lb + ub)/2; mergeSort(lb, split); mergeSort(split, ub); merge(lb, split, ub); } } void MergeSort(){ mergeSort(0,rows.size()); } void OrderDesc(){ reverse(rows.begin(),rows.end()); } void OrderRand(){ vector rows2; //list::iterator b=rows.end(); rows2.insert(rows2.begin(),rows.begin(),rows.end()); random_shuffle(rows2.begin(),rows2.end()); rows.clear(); rows.insert(rows.begin(),rows2.begin(),rows2.end()); } friend ostream &operator<<(ostream &stream, Table table); }; ostream &operator<<(ostream &stream, Table table){ cout<<"===============================================================================\n"; list::iterator p=table.rows.begin(); while(p!=table.rows.end()){ cout<<**p; p++; } cout<<"===============================================================================\n"; } void ShowMeTheMagic(char* fn){ Table table(fn); cout<<"Initial table:\n"; cout<