Advertisement
Guest User

All sorting algorithms in one class

a guest
Mar 31st, 2014
242
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 24.31 KB | None | 0 0
  1. //Класс содержащий все сортировки, которые тебе нужны:пузырек, вставка, быстрая, слияние и т.д.
  2. //Это заголовочный:
  3.  
  4.  
  5.  
  6.  
  7.  
  8.  
  9.  
  10.  
  11.  
  12.  
  13.  
  14.  
  15.  
  16. #include <vector>
  17. using std::vector;
  18.  
  19. #ifndef CLASSES
  20. #define CLASSES
  21.  
  22.  
  23. class SortByBubble{
  24.     friend void quickSort(int* arrayForSort, int right);
  25.     friend void quickSortplusMedian(int* arrayForSort, int right);
  26.     friend void quickSortplusInsertion(int* arrayForSort, int right);
  27.     friend void ultraQuickSort(int* arrayForSort, int right);
  28.     friend void insertion(int* arrayForSort, int right);
  29.     friend void mergeSort(int* arrayForSort, int size);
  30.  
  31.  
  32.  
  33.     const int sizeOfVector;
  34.     const int numberOfVectors;
  35.     bool  isAscending;
  36.     int **sameVectors;
  37.     int **bufferForVectors;
  38.     int **sortedVectors;
  39. public:
  40.     SortByBubble(int vectorSize, int NumberOfVectors, bool isAscend);
  41.     SortByBubble(int vectorSize, int NumberOfVectors, bool isAscend,int lb,int rb);
  42.     ~SortByBubble();
  43.     double bubbleTime();
  44.     double choiceTime();
  45.     double insertTime();
  46.     double shellShellTime(); //using original Shell sequence
  47.     double shellShellTime2();
  48.     double shellA102549Time(); //using A102549 sequence. It's well known sequence, don't you know???
  49.     double shellHibbardTime(); //using Hibbard sequence. all i:(2^i-1)<=N
  50.     double shellDeuce();
  51.     double hibbard();
  52.     double ciura();
  53.     double shellDeuceWithOutput();
  54.     double hibbardWithOutput();
  55.     double ciuraWithOutput();
  56.     double insert();
  57.     double quickSortTime();
  58.     double quickSortplusInsertionTime();//must be better on 20%
  59.     double quickSortplusMedianTime();//must be better on 5%
  60.     double ultraQuickSortTime();//25%
  61.     double heapSortTime();
  62.     double mergeSortTime();
  63.     void heapify(int firstIndex, int secondIndex, int length);
  64.     void makeHeap();
  65.     void printUnsort2txt();
  66.     void printSort2txt();
  67. };
  68.  
  69. #endif /*CLASSES*/
  70.  
  71.  
  72.  
  73.  
  74.  
  75.  
  76.  
  77.  
  78.  
  79.  
  80.  
  81. //ЭТО РЕАЛИЗАЦИЯ КЛАССА.
  82.  
  83.  
  84.  
  85.  
  86.  
  87.  
  88.  
  89.  
  90.  
  91.  
  92.  
  93.  
  94.  
  95.  
  96.  
  97.  
  98.  
  99. #include "Classes.h"
  100. #include <ctime>
  101. #include <fstream>
  102. #include <iomanip>
  103. #include <ctime>
  104. #include <cstdlib>
  105.  
  106. using std::swap;
  107. using std::endl;
  108. using std::setw;
  109. using std::ctime;
  110. using std::srand;
  111. using std::pow;
  112. using std::printf;
  113.  
  114. //SortByBubble::SortByBubble(int vSize = 10, int nVectors = 10, bool isAscend = true):
  115. //  sizeOfVector(vSize),
  116. //  numberOfVectors(nVectors)
  117. //{
  118. //  srand(time(NULL));
  119. //  sameVectors = new int*[nVectors];
  120. //  bufferForVectors = new int*[nVectors];
  121. //  sortedVectors = new int*[nVectors];
  122. //  for(int i=0;i<nVectors;i++){
  123. //      sameVectors[i] = new int[vSize];
  124. //      bufferForVectors[i] = new int[vSize];
  125. //      sortedVectors[i] = new int[vSize];
  126. //      for(int j=0;j<vSize;j++){
  127. //          sameVectors[i][j] = j;
  128. //          bufferForVectors[i][j] = sameVectors[i][j];
  129. //      }
  130. //  }
  131. //}
  132.  
  133. bool errflag = 0;
  134. SortByBubble::SortByBubble(int vSize = 10, int nVectors = 10, bool isAscend = true, int lb = 1, int rb = 100):
  135.     sizeOfVector(vSize),
  136.     numberOfVectors(nVectors)
  137. {
  138.     srand(time(NULL));
  139.     sameVectors = new int*[nVectors];
  140.     bufferForVectors = new int*[nVectors];
  141.     sortedVectors = new int*[nVectors];
  142.     for(int i=0;i<nVectors;i++){
  143.         sameVectors[i] = new int[vSize];
  144.         bufferForVectors[i] = new int[vSize];
  145.         sortedVectors[i] = new int[vSize];
  146.         for(int j=0;j<vSize;j++){
  147.             sameVectors[i][j] = rand()%(rb -lb +1)+lb;
  148.             bufferForVectors[i][j] = sameVectors[i][j];
  149.         }
  150.     }
  151. }
  152. SortByBubble::~SortByBubble(){
  153.     for(int i = 0; i<numberOfVectors;i++){
  154.         delete[] sortedVectors[i];
  155.         delete[] sameVectors[i];
  156.         delete[] bufferForVectors[i];
  157.     }
  158.     delete[] sortedVectors;
  159.     delete[] sameVectors;
  160.     delete[] bufferForVectors;
  161. }
  162.  
  163. //print unsorted and sorted arrays in file
  164. void SortByBubble::printUnsort2txt(){
  165.     std::ofstream output("unsortarray.txt");
  166.     for(int j=0;j<numberOfVectors;j++){
  167.         output<<"\n***** "<<j<<" *****\n\n";
  168.         for(int i=0;i<sizeOfVector;i++){
  169.             output<<setw(6)<<sameVectors[j][i];
  170.             //if((i!=0)&&(i%20 == 19)) output<<endl;
  171.         }
  172.         output<<endl;
  173.     }
  174.     output.close();
  175. }
  176. void SortByBubble::printSort2txt(){
  177.     std::ofstream output("sortarray.txt");
  178.     if(errflag) output<<"\nERROR\n";
  179.     for(int j=0;j<numberOfVectors;j++){
  180.         output<<"\n***** "<<j<<" *****\n\n";
  181.         for(int i=0;i<sizeOfVector;i++){
  182.             output<<setw(6)<<sortedVectors[j][i];
  183.             //if((i!=0)&&(i%20 == 19)) output<<endl;
  184.         }
  185.         output<<endl;
  186.     }
  187.     output.close();
  188. }
  189. //simple sorts
  190. double SortByBubble::bubbleTime(){
  191.     time_t start;
  192.     time_t stop;
  193.     double bubbleTime=0;
  194.     for(int j=0;j<numberOfVectors;j++){
  195.         time(&start);
  196.         bool flag = 1;
  197.         while(flag){
  198.             bool fflag = 0;
  199.             for(int i=0;i<sizeOfVector-1;i++){
  200.                 if(sameVectors[j][i]>sameVectors[j][i+1]){
  201.                     int t = sameVectors[j][i];
  202.                     sameVectors[j][i] = sameVectors[j][i+1];
  203.                     sameVectors[j][i+1] = t;
  204.                     fflag = 1;
  205.                 }
  206.             }
  207.             if(fflag==0) flag=0;
  208.         }
  209.         time(&stop);
  210.         bubbleTime += difftime(stop, start);
  211.         //Check errors.
  212.         for(int i = 0;i<sizeOfVector-1;i++){
  213.             if(sameVectors[j][i]>sameVectors[j][i+1]){
  214.                 errflag = true;
  215.             }
  216.         }
  217.     }
  218.  
  219.     for(int i = 0; i<numberOfVectors;i++){
  220.         for(int j = 0 ; j<sizeOfVector; j++){
  221.             sortedVectors[i][j] = sameVectors[i][j];
  222.             sameVectors[i][j] = bufferForVectors[i][j];
  223.         }
  224.     }
  225.     return bubbleTime/numberOfVectors;
  226. }
  227. double SortByBubble::choiceTime(){
  228.     time_t start;
  229.     time_t stop;
  230.     double choiceTime=0;
  231.     for(int k = 0;k<numberOfVectors;k++){
  232.  
  233.         time(&start);
  234.         for(int i=0;i<sizeOfVector-1;i++){
  235.             int min = i;
  236.             for(int j=i+1;j<sizeOfVector;j++){
  237.                 if(sameVectors[k][min]>sameVectors[k][j]){
  238.                     min = j;
  239.                 }
  240.             }
  241.             if(min!=i){
  242.                 int t = sameVectors[k][min];
  243.                 sameVectors[k][min] = sameVectors[k][i];
  244.                 sameVectors[k][i] = t;
  245.             }
  246.         }
  247.         time(&stop);
  248.         choiceTime+=difftime(stop,start);
  249.         //Check errors.
  250.         for(int i = 0;i<sizeOfVector-1;i++){
  251.             if(sameVectors[k][i]>sameVectors[k][i+1]){
  252.                 errflag = true;
  253.             }
  254.         }
  255.     }
  256.     for(int i = 0; i<numberOfVectors;i++){
  257.         for(int j = 0 ; j<sizeOfVector; j++){
  258.             sortedVectors[i][j] = sameVectors[i][j];
  259.             sameVectors[i][j] = bufferForVectors[i][j];
  260.         }
  261.     }
  262.     return choiceTime/numberOfVectors;
  263. }
  264. double SortByBubble::insertTime(){
  265.     time_t start;
  266.     time_t stop;
  267.     double insertTime = 0;
  268.  
  269.     for(int i=0;i<numberOfVectors;i++){
  270.         time(&start);
  271.  
  272.         for(int j=1;j<sizeOfVector;j++){
  273.             int current = sameVectors[i][j];
  274.             int k = j;
  275.             while((k>0)&&(sameVectors[i][k-1]>current)){
  276.                 sameVectors[i][k] = sameVectors[i][k-1];
  277.                 k--;
  278.             }
  279.             sameVectors[i][k] = current;
  280.         }
  281.         time(&stop);
  282.         insertTime += difftime(stop,start);
  283.         //Check errors.
  284.         for(int k = 0;k<sizeOfVector-1;k++){
  285.             if(sameVectors[i][k]>sameVectors[i][k+1]){
  286.                 errflag = true;
  287.             }
  288.         }
  289.     }
  290.     for(int i = 0; i<numberOfVectors;i++){
  291.         for(int j = 0 ; j<sizeOfVector; j++){
  292.             sortedVectors[i][j] = sameVectors[i][j];
  293.             sameVectors[i][j] = bufferForVectors[i][j];
  294.         }
  295.     }
  296.     return insertTime/numberOfVectors;
  297. }
  298. //just work. very fast. i don't know why
  299. double SortByBubble::shellDeuce(){
  300.     time_t start;
  301.     time_t stop;
  302.     double shellTime = 0;
  303.  
  304.     int step[20];
  305.     for(int i = 0;i<20;i++) step[i] = pow(2,i);
  306.  
  307.     int l = 19;
  308.     while(step[l]>sizeOfVector) l--;
  309.     int buff = l;
  310.     for(int j = 0; j<numberOfVectors;j++){
  311.         time(&start);
  312.  
  313.         for(l = buff;l>=0;l--){
  314.             int gap = step[l];
  315.             for(int i = gap;i<sizeOfVector;i++){
  316.                 int temp = sameVectors[j][i];
  317.                 int k;
  318.                 for(k = i; (k>=gap)&&(sameVectors[j][k-gap]>temp);k-=gap){
  319.                     sameVectors[j][k] = sameVectors[j][k-gap];
  320.                 }
  321.                 sameVectors[j][k] = temp;
  322.             }
  323.         }
  324.         time(&stop);
  325.         shellTime +=difftime(stop,start);
  326.         //Check errors.
  327.         for(int i = 0;i<sizeOfVector-1;i++){
  328.             if(sameVectors[j][i]>sameVectors[j][i+1]){
  329.                 errflag = true;
  330.             }
  331.         }
  332.     }
  333.    
  334.     for(int i = 0; i<numberOfVectors;i++){
  335.         for(int j = 0 ; j<sizeOfVector; j++){
  336.             sortedVectors[i][j] = sameVectors[i][j];
  337.             sameVectors[i][j] = bufferForVectors[i][j];
  338.         }
  339.     }
  340.     return shellTime/numberOfVectors;
  341. }
  342. double SortByBubble::hibbard(){
  343.     time_t start;
  344.     time_t stop;
  345.     double shellTime = 0;
  346.  
  347.     int step[20];
  348.     for(int i = 1;i<=20;i++) step[i-1] = (pow(2,i)-1);
  349.  
  350.     int l = 19;
  351.     while(step[l]>sizeOfVector) l--;
  352.     int buff = l;
  353.  
  354.     for(int j = 0; j<numberOfVectors;j++){
  355.         time(&start);
  356.  
  357.         for(l = buff;l>=0;l--){
  358.             int gap = step[l];
  359.             for(int i = gap;i<sizeOfVector;i++){
  360.                 int temp = sameVectors[j][i];
  361.                 int k;
  362.                 for(k = i; (k>=gap)&&(sameVectors[j][k-gap]>temp);k-=gap){
  363.                     sameVectors[j][k] = sameVectors[j][k-gap];
  364.                 }
  365.                 sameVectors[j][k] = temp;
  366.             }
  367.         }
  368.  
  369.         time(&stop);
  370.         shellTime +=difftime(stop,start);
  371.         //Check errors.
  372.         for(int i = 0;i<sizeOfVector-1;i++){
  373.             if(sameVectors[j][i]>sameVectors[j][i+1]){
  374.                 errflag = true;
  375.             }
  376.         }
  377.  
  378.     }
  379.    
  380.     for(int i = 0; i<numberOfVectors;i++){
  381.         for(int j = 0 ; j<sizeOfVector; j++){
  382.             sortedVectors[i][j] = sameVectors[i][j];
  383.             sameVectors[i][j] = bufferForVectors[i][j];
  384.         }
  385.     }
  386.     return shellTime/numberOfVectors;
  387. }
  388. double SortByBubble::ciura(){
  389.     time_t start;
  390.     time_t stop;
  391.     double shellTime = 0;
  392.  
  393.     int step[] = {1, 4, 10, 23, 57, 132, 301, 701, 1750};
  394.  
  395.     int l = 8;
  396.     while(step[l]>sizeOfVector) l--;
  397.     int buff = l;
  398.     for(int j = 0; j<numberOfVectors;j++){
  399.         time(&start);
  400.        
  401.         for(l = buff;l>=0;l--){
  402.             int gap = step[l];
  403.             for(int i = gap;i<sizeOfVector;i++){
  404.                 int temp = sameVectors[j][i];
  405.                 int k;
  406.                 for(k = i; (k>=gap)&&(sameVectors[j][k-gap]>temp);k-=gap){
  407.                     sameVectors[j][k] = sameVectors[j][k-gap];
  408.                 }
  409.                 sameVectors[j][k] = temp;
  410.             }
  411.         }
  412.         time(&stop);
  413.         shellTime +=difftime(stop,start);
  414.         //Check errors.
  415.         for(int i = 0;i<sizeOfVector-1;i++){
  416.             if(sameVectors[j][i]>sameVectors[j][i+1]){
  417.                 errflag = true;
  418.             }
  419.         }
  420.     }
  421.    
  422.     for(int i = 0; i<numberOfVectors;i++){
  423.         for(int j = 0 ; j<sizeOfVector; j++){
  424.             sortedVectors[i][j] = sameVectors[i][j];
  425.             sameVectors[i][j] = bufferForVectors[i][j];
  426.         }
  427.     }
  428.     return shellTime/numberOfVectors;
  429. }
  430. //work. Print every step in file
  431. double SortByBubble::shellDeuceWithOutput(){
  432.     std::ofstream output("shellDeuceEveryStep.txt");
  433.     time_t start;
  434.     time_t stop;
  435.     double shellTime = 0;
  436.  
  437.     int step[20];
  438.     for(int i = 0;i<20;i++) step[i] = pow(2,i);
  439.  
  440.     int l = 19;
  441.     while(step[l]>sizeOfVector) l--;
  442.     int buff = l;
  443.     for(int j = 0; j<numberOfVectors;j++){
  444.         output<<"\n*****"<<j<<"*****\n";
  445.  
  446.         time(&start);
  447.         for(int y=0;y<sizeOfVector;y++){
  448.                     output<<setw(4)<<sameVectors[j][y];
  449.                 }
  450.                 output<<endl;
  451.         for(l = buff;l>=0;l--){
  452.             int gap = step[l];
  453.             output<<"GAP - "<<gap<<endl;
  454.             for(int i = gap;i<sizeOfVector;i++){
  455.                 int temp = sameVectors[j][i];
  456.                 int k;
  457.                 for(k = i; (k>=gap)&&(sameVectors[j][k-gap]>temp);k-=gap){
  458.                     sameVectors[j][k] = sameVectors[j][k-gap];
  459.                 }
  460.                 sameVectors[j][k] = temp;
  461.                 for(int y=0;y<sizeOfVector;y++){
  462.                     output<<setw(4)<<sameVectors[j][y];
  463.                 }
  464.                 output<<endl;
  465.             }
  466.         }
  467.         time(&stop);
  468.         shellTime +=difftime(stop,start);
  469.         //Check errors.
  470.         for(int i = 0;i<sizeOfVector-1;i++){
  471.             if(sameVectors[j][i]>sameVectors[j][i+1]){
  472.                 errflag = true;
  473.             }
  474.         }
  475.     }
  476.    
  477.     for(int i = 0; i<numberOfVectors;i++){
  478.         for(int j = 0 ; j<sizeOfVector; j++){
  479.             sortedVectors[i][j] = sameVectors[i][j];
  480.             sameVectors[i][j] = bufferForVectors[i][j];
  481.         }
  482.     }
  483.     output.close();
  484.     return shellTime/numberOfVectors;
  485. }
  486. double SortByBubble::hibbardWithOutput(){
  487.     std::ofstream output("shellHibbardEveryStep.txt");
  488.     time_t start;
  489.     time_t stop;
  490.     double shellTime = 0;
  491.  
  492.     int step[20];
  493.     for(int i = 1;i<=20;i++) step[i-1] = (pow(2,i)-1);
  494.  
  495.     int l = 19;
  496.     while(step[l]>sizeOfVector) l--;
  497.     int buff = l;
  498.  
  499.     for(int j = 0; j<numberOfVectors;j++){
  500.         time(&start);
  501.         output<<"\n*****"<<j<<"*****\n";
  502.         for(int y=0;y<sizeOfVector;y++){
  503.                     output<<setw(4)<<sameVectors[j][y];
  504.                 }
  505.                 output<<endl;
  506.         for(l = buff;l>=0;l--){
  507.             int gap = step[l];
  508.             output<<"GAP - "<<gap<<endl;
  509.             for(int i = gap;i<sizeOfVector;i++){
  510.                 int temp = sameVectors[j][i];
  511.                 int k;
  512.                 for(k = i; (k>=gap)&&(sameVectors[j][k-gap]>temp);k-=gap){
  513.                     sameVectors[j][k] = sameVectors[j][k-gap];
  514.                 }
  515.                 sameVectors[j][k] = temp;
  516.                 for(int y=0;y<sizeOfVector;y++){
  517.                     output<<setw(4)<<sameVectors[j][y];
  518.                 }
  519.                 output<<endl;
  520.             }
  521.         }
  522.  
  523.         time(&stop);
  524.         shellTime +=difftime(stop,start);
  525.         //Check errors.
  526.         for(int i = 0;i<sizeOfVector-1;i++){
  527.             if(sameVectors[j][i]>sameVectors[j][i+1]){
  528.                 errflag = true;
  529.             }
  530.         }
  531.  
  532.     }
  533.    
  534.     for(int i = 0; i<numberOfVectors;i++){
  535.         for(int j = 0 ; j<sizeOfVector; j++){
  536.             sortedVectors[i][j] = sameVectors[i][j];
  537.             sameVectors[i][j] = bufferForVectors[i][j];
  538.         }
  539.     }
  540.     output.close();
  541.     return shellTime/numberOfVectors;
  542. }
  543. double SortByBubble::ciuraWithOutput(){
  544.     std::ofstream output("shellCiuraEveryStep.txt");
  545.     time_t start;
  546.     time_t stop;
  547.     double shellTime = 0;
  548.  
  549.     int step[] = {1, 4, 10, 23, 57, 132, 301, 701, 1750};
  550.  
  551.     int l = 8;
  552.     while(step[l]>sizeOfVector) l--;
  553.     int buff = l;
  554.     for(int j = 0; j<numberOfVectors;j++){
  555.         time(&start);
  556.         output<<"\n*****"<<j<<"*****\n";
  557.         for(int y=0;y<sizeOfVector;y++){
  558.                     output<<setw(4)<<sameVectors[j][y];
  559.                 }
  560.                 output<<endl;
  561.         for(l = buff;l>=0;l--){
  562.             int gap = step[l];
  563.             output<<"GAP - "<<gap<<endl;
  564.             for(int i = gap;i<sizeOfVector;i++){
  565.                 int temp = sameVectors[j][i];
  566.                 int k;
  567.                 for(k = i; (k>=gap)&&(sameVectors[j][k-gap]>temp);k-=gap){
  568.                     sameVectors[j][k] = sameVectors[j][k-gap];
  569.                 }
  570.                 sameVectors[j][k] = temp;
  571.                 for(int y=0;y<sizeOfVector;y++){
  572.                     output<<setw(4)<<sameVectors[j][y];
  573.                 }
  574.                 output<<endl;
  575.             }
  576.         }
  577.         time(&stop);
  578.         shellTime +=difftime(stop,start);
  579.         //Check errors.
  580.         for(int i = 0;i<sizeOfVector-1;i++){
  581.             if(sameVectors[j][i]>sameVectors[j][i+1]){
  582.                 errflag = true;
  583.             }
  584.         }
  585.     }
  586.    
  587.     for(int i = 0; i<numberOfVectors;i++){
  588.         for(int j = 0 ; j<sizeOfVector; j++){
  589.             sortedVectors[i][j] = sameVectors[i][j];
  590.             sameVectors[i][j] = bufferForVectors[i][j];
  591.         }
  592.     }
  593.     output.close();
  594.     return shellTime/numberOfVectors;
  595. }
  596. double SortByBubble::quickSortTime(){
  597.     time_t start;
  598.     time_t stop;
  599.     double quickSortTime=0;
  600.     for(int k=0;k<numberOfVectors;k++){
  601.         time(&start);
  602.        
  603.         quickSort(sameVectors[k],sizeOfVector-1);
  604.  
  605.         time(&stop);
  606.         quickSortTime+=difftime(stop,start);
  607.         //Check errors.
  608.         for(int i = 0;i<sizeOfVector-1;i++){
  609.             if(sameVectors[k][i]>sameVectors[k][i+1]){
  610.                 errflag = true;
  611.             }
  612.         }
  613.     }
  614.     sortedVectors = sameVectors;
  615.     sameVectors = bufferForVectors;
  616.     return quickSortTime/numberOfVectors;
  617. }
  618. double SortByBubble::quickSortplusInsertionTime(){
  619.     time_t start;
  620.     time_t stop;
  621.     double quickSortTime=0;
  622.     for(int k=0;k<numberOfVectors;k++){
  623.         time(&start);
  624.        
  625.         quickSortplusInsertion(sameVectors[k],sizeOfVector-1);
  626.  
  627.         time(&stop);
  628.         quickSortTime+=difftime(stop,start);
  629.         //Check errors.
  630.         for(int i = 0;i<sizeOfVector-1;i++){
  631.             if(sameVectors[k][i]>sameVectors[k][i+1]){
  632.                 errflag = true;
  633.             }
  634.         }
  635.     }
  636.     sortedVectors = sameVectors;
  637.     sameVectors = bufferForVectors;
  638.     return quickSortTime/numberOfVectors;
  639. }
  640. double SortByBubble::quickSortplusMedianTime(){
  641.     time_t start;
  642.     time_t stop;
  643.     double quickSortTime=0;
  644.     for(int k=0;k<numberOfVectors;k++){
  645.         time(&start);
  646.        
  647.         quickSortplusMedian(sameVectors[k],sizeOfVector-1);
  648.  
  649.         time(&stop);
  650.         quickSortTime+=difftime(stop,start);
  651.         //Check errors.
  652.         for(int i = 0;i<sizeOfVector-1;i++){
  653.             if(sameVectors[k][i]>sameVectors[k][i+1]){
  654.                 errflag = true;
  655.             }
  656.         }
  657.     }
  658.     sortedVectors = sameVectors;
  659.     sameVectors = bufferForVectors;
  660.     return quickSortTime/numberOfVectors;
  661. }
  662. double SortByBubble::ultraQuickSortTime(){
  663.     time_t start;
  664.     time_t stop;
  665.     double quickSortTime=0;
  666.     for(int k=0;k<numberOfVectors;k++){
  667.         time(&start);
  668.  
  669.         ultraQuickSort(sameVectors[k],sizeOfVector-1);
  670.  
  671.         time(&stop);
  672.         quickSortTime+=difftime(stop,start);
  673.         //Check errors.
  674.         for(int i = 0;i<sizeOfVector-1;i++){
  675.             if(sameVectors[k][i]>sameVectors[k][i+1]){
  676.                 errflag = true;
  677.             }
  678.         }
  679.     }
  680.     sortedVectors = sameVectors;
  681.     sameVectors = bufferForVectors;
  682.     return quickSortTime/numberOfVectors;
  683. }
  684. double SortByBubble::heapSortTime(){
  685.     time_t start;
  686.     time_t stop;
  687.     double heapSortTime=0;
  688.     for(int k=0;k<numberOfVectors;k++){
  689.         time(&start);
  690.  
  691.         for(int i = sizeOfVector/2;i>=0;i--){
  692.             heapify(k,i,sizeOfVector);
  693.         }
  694.  
  695.         for(int i = sizeOfVector - 1;i>0;){
  696.             swap(sameVectors[k][i],sameVectors[k][0]);
  697.             i--;
  698.             heapify(k,0,i);
  699.         }
  700.    
  701.  
  702.         time(&stop);
  703.         heapSortTime+=difftime(stop,start);
  704.         //Check errors.
  705.         for(int i = 0;i<sizeOfVector-1;i++){
  706.             if(sameVectors[k][i]>sameVectors[k][i+1]){
  707.                 errflag = true;
  708.             }
  709.         }
  710.     }
  711.     sortedVectors = sameVectors;
  712.     sameVectors = bufferForVectors;
  713.     return heapSortTime/numberOfVectors;
  714. }
  715. double SortByBubble::mergeSortTime(){
  716.     time_t start;
  717.     time_t stop;
  718.     double mergeSortTime=0;
  719.     for(int k=0;k<numberOfVectors;k++){
  720.         time(&start);
  721.  
  722.         mergeSort(sameVectors[k],sizeOfVector);
  723.  
  724.         time(&stop);
  725.         mergeSortTime+=difftime(stop,start);
  726.         //Check errors.
  727.         for(int i = 0;i<sizeOfVector-1;i++){
  728.             if(sameVectors[k][i]>sameVectors[k][i+1]){
  729.                 errflag = true;
  730.                 break;
  731.             }
  732.         }
  733.         if(errflag) break;
  734.     }
  735.     sortedVectors = sameVectors;
  736.     sameVectors = bufferForVectors;
  737.     return mergeSortTime/numberOfVectors;
  738. }
  739.  
  740. void SortByBubble::heapify(int fIndex, int sIndex, int length){
  741.     while(true){
  742.         int leftChild = 2*sIndex + 1;
  743.         int rightChild = 2*sIndex + 2;
  744.         int elder = sIndex;
  745.  
  746.         if((leftChild < length+1) && (sameVectors[fIndex][leftChild]>sameVectors[fIndex][elder])){
  747.             elder = leftChild;
  748.         }
  749.         if((rightChild < length+1)&&(sameVectors[fIndex][rightChild]>sameVectors[fIndex][elder])){
  750.             elder = rightChild;
  751.         }
  752.         if(elder == sIndex) break;
  753.  
  754.         swap(sameVectors[fIndex][sIndex],sameVectors[fIndex][elder]);
  755.         sIndex = elder;
  756.     }
  757. }
  758. void SortByBubble::makeHeap(){
  759.     for(int j = 0; j<numberOfVectors;j++){
  760.  
  761.         for(int i = sizeOfVector/2;i>=0;i--){
  762.             heapify(j,i,sizeOfVector);
  763.         }
  764.  
  765.     }
  766. }
  767.  
  768.  
  769.  
  770.  
  771.  
  772. void insertion(int* arr, int size){
  773.     for(int j=1;j<size+1;j++){
  774.             int current = arr[j];//HAAARRRRR!!!
  775.             int k = j;
  776.             while((k>0)&&(arr[k-1]>current)){
  777.                 arr[k] = arr[k-1];
  778.                 k--;
  779.             }
  780.             arr[k] = current;
  781.     }
  782. }
  783. void quickSort(int* arrayForSort, int size){
  784.     int pivot = size/2;
  785.     int base = arrayForSort[pivot];
  786.     int leftIterator = 0;
  787.     int rightIterator = size;
  788.     do{
  789.         while(arrayForSort[leftIterator]<base)leftIterator++;
  790.         while(arrayForSort[rightIterator]>base) rightIterator--;
  791.         if(leftIterator<=rightIterator){
  792.             swap(arrayForSort[leftIterator],arrayForSort[rightIterator]);
  793.             leftIterator++;
  794.             rightIterator--;
  795.         }
  796.     }while(leftIterator<=rightIterator);
  797.     if(rightIterator>0) quickSort(arrayForSort, rightIterator);
  798.     if(size>leftIterator) quickSort(arrayForSort+leftIterator, size-leftIterator);
  799. }
  800. void quickSortplusInsertion(int *arrayForSort, int size){
  801.     if(size<25){
  802.         insertion(arrayForSort,size);
  803.         return;
  804.     }
  805.     int pivot = size/2;
  806.     int base = arrayForSort[pivot];
  807.     int leftIterator = 0;
  808.     int rightIterator = size;
  809.     do{
  810.         while(arrayForSort[leftIterator]<base)leftIterator++;
  811.         while(arrayForSort[rightIterator]>base) rightIterator--;
  812.         if(leftIterator<=rightIterator){
  813.             swap(arrayForSort[leftIterator],arrayForSort[rightIterator]);
  814.             leftIterator++;
  815.             rightIterator--;
  816.         }
  817.     }while(leftIterator<=rightIterator);
  818.     if(rightIterator>0) quickSortplusInsertion(arrayForSort, rightIterator);
  819.     if(size>leftIterator) quickSortplusInsertion(arrayForSort+leftIterator, size-leftIterator);
  820. }
  821. void quickSortplusMedian(int *arrayForSort, int size){
  822.     int pivot = (rand()%(size+1)+rand()%(size+1)+rand()%(size+1))/3;
  823.     int base = arrayForSort[pivot];
  824.     int leftIterator = 0;
  825.     int rightIterator = size;
  826.     do{
  827.         while(arrayForSort[leftIterator]<base)leftIterator++;
  828.         while(arrayForSort[rightIterator]>base) rightIterator--;
  829.         if(leftIterator<=rightIterator){
  830.             swap(arrayForSort[leftIterator],arrayForSort[rightIterator]);
  831.             leftIterator++;
  832.             rightIterator--;
  833.         }
  834.     }while(leftIterator<=rightIterator);
  835.     if(rightIterator>0) quickSortplusMedian(arrayForSort, rightIterator);
  836.     if(size>leftIterator) quickSortplusMedian(arrayForSort+leftIterator, size-leftIterator);
  837. }
  838. void ultraQuickSort(int *arrayForSort, int size){
  839.     if(size<25){
  840.         insertion(arrayForSort,size);
  841.         return;
  842.     }
  843.     int pivot = (rand()%(size+1)+rand()%(size+1)+rand()%(size+1))/3;
  844.     int base = arrayForSort[pivot];
  845.     int leftIterator = 0;
  846.     int rightIterator = size;
  847.     do{
  848.         while(arrayForSort[leftIterator]<base)leftIterator++;
  849.         while(arrayForSort[rightIterator]>base) rightIterator--;
  850.         if(leftIterator<=rightIterator){
  851.             swap(arrayForSort[leftIterator],arrayForSort[rightIterator]);
  852.             leftIterator++;
  853.             rightIterator--;
  854.         }
  855.     }while(leftIterator<=rightIterator);
  856.     if(rightIterator>0) ultraQuickSort(arrayForSort, rightIterator);
  857.     if(size>leftIterator) ultraQuickSort(arrayForSort+leftIterator, size-leftIterator);
  858. }
  859. void mergeSort(int *forSort, int size){
  860.     if(size>25){
  861.         int halfSize = size/2;
  862.         mergeSort(forSort,halfSize);
  863.         mergeSort(forSort+halfSize,size - halfSize);
  864.         int firstIterator = 0;
  865.         int secondIterator = 0;
  866.         int* tmp = new int[size];
  867.         int i = 0;
  868.         while(((firstIterator<halfSize)||(secondIterator<(size-halfSize)))&&(i<size)){
  869.             if(forSort[firstIterator]>(forSort+halfSize)[secondIterator]){
  870.                 if(secondIterator>=(size - halfSize)){
  871.                     tmp[i] = forSort[firstIterator];
  872.                     firstIterator++;
  873.                     i++;
  874.                 }
  875.                 else{
  876.                     tmp[i] = (forSort+halfSize)[secondIterator];
  877.                     secondIterator++;
  878.                     i++;
  879.                 }
  880.             }
  881.             else{
  882.                 if(firstIterator>=halfSize){
  883.                     tmp[i] = (forSort+halfSize)[secondIterator];
  884.                     secondIterator++;
  885.                     i++;
  886.                 }
  887.                 else{
  888.                     tmp[i] = forSort[firstIterator];
  889.                     firstIterator++;
  890.                     i++;
  891.                 }
  892.             }
  893.         }
  894.         /*for(int i = 0;i<size;i++){
  895.             if(forSort[firstIterator]>(forSort+halfSize)[secondIterator]&&((firstIterator<halfSize)||(secondIterator<(size-halfSize)))){
  896.                 tmp[i] = (forSort+halfSize)[secondIterator];
  897.                 secondIterator++;
  898.             }
  899.             else{
  900.                 tmp[i] = forSort[firstIterator];
  901.                 firstIterator++;
  902.             }
  903.         }
  904.             */
  905.         for(i = 0;i<size;i++){
  906.             forSort[i] = tmp[i];
  907.         }
  908.         delete[] tmp;
  909.     }
  910.     else{
  911.         insertion(forSort,size-1);
  912.     }
  913. }
  914.  
  915.  
  916.  
  917.  
  918.  
  919.  
  920.  
  921.  
  922.  
  923.  
  924.  
  925.  
  926. //ЗДЕСЬ МЭИН в котором тестируются все сортировки, замеряется время
  927.  
  928.  
  929.  
  930.  
  931.  
  932.  
  933.  
  934.  
  935.  
  936.  
  937.  
  938.  
  939.  
  940.  
  941.  
  942.  
  943.  
  944.  
  945.  
  946.  
  947. #include "Classes.h"
  948. #include <iostream>
  949. using std::cout;
  950.  
  951. int main(){
  952.     cout<<"Sorting arrays with different sorts.\n"
  953.         <<"\nInsertion, Bubble & Selection\n\n";
  954.     int numberOfArrays = 10;
  955.     int sizeOfArrays = 70000;
  956.     int l = 1;
  957.     int r = 7000;
  958.     double time=0;
  959.     cout<<"Arrays contains "<<sizeOfArrays<<" different integeres.\n"
  960.         <<"And we have "<<numberOfArrays<<" such arrays.\n";
  961.    
  962.     SortByBubble vec(sizeOfArrays,numberOfArrays, true,l,r);
  963.     vec.printUnsort2txt();
  964.    
  965.     cout<<"\nSorting by \"Bubble\"...\n";
  966.     time = vec.bubbleTime();
  967.     cout<<"Sort completed in "<<time<<"seconds.\n";
  968.    
  969.     cout<<"\nSorting by \"Selection\"...\n";
  970.     time = vec.choiceTime();
  971.     cout<<"Sort completed in "<<time<<"seconds.\n";
  972.    
  973.     cout<<"\nSorting by \"Insertion\"...\n";
  974.     time = vec.insertTime();
  975.     cout<<"Sort completed in "<<time<<"seconds.\n";
  976.    
  977.     cout<<"\nSorting by \"Shell\" using 2^i sequence (1,2,4,8,16,32...\n";
  978.     time = vec.shellDeuceWithOutput();
  979.     cout<<"Sort completed in "<<time<<"seconds.\n";
  980.    
  981.     cout<<"\nSorting by \"Shell\" using Hibbard sequence (every i:(2^i-1)<=N)...\n";
  982.     time = vec.hibbardWithOutput();
  983.     cout<<"Sort completed in "<<time<<"seconds.\n";
  984.    
  985.     cout<<"\nSorting by \"Shell\" using A102549 sequence (1,4,10,23,57,132,301,701,1750)...\n";
  986.     time = vec.ciuraWithOutput();
  987.     cout<<"Sort completed in "<<time<<"seconds.\n";
  988.    
  989.     cout<<"\nSorting by \"QuickSort\"...\n";
  990.     time = vec.quickSortTime();
  991.     cout<<"Sort completed in "<<time<<"seconds.\n";
  992.  
  993.     cout<<"\nSorting by \"QuickSort\"+\"Insertion\"...\n";
  994.     time = vec.quickSortplusInsertionTime();
  995.     cout<<"Sort completed in "<<time<<"seconds.\n";
  996.  
  997.     cout<<"\nSorting by \"QuickSort\"+\"Median\"...\n";
  998.     time = vec.quickSortplusMedianTime();
  999.     cout<<"Sort completed in "<<time<<"seconds.\n";
  1000.    
  1001.     cout<<"\nSorting by \"QuickSort\"+\"Med\"+\"Insertion\"...\n";
  1002.     time = vec.ultraQuickSortTime();
  1003.     cout<<"Sort completed in "<<time<<"seconds.\n";
  1004.    
  1005.     cout<<"\nSorting by \"HeapSort\"...\n";
  1006.     time = vec.heapSortTime();
  1007.     cout<<"Sort completed in "<<time<<"seconds.\n";
  1008.    
  1009.     cout<<"\nSorting by \"MergeSort\"...\n";
  1010.     time = vec.mergeSortTime();
  1011.     cout<<"Sort completed in "<<time<<"seconds.\n";
  1012.    
  1013.     vec.printSort2txt();
  1014.     system("pause");   
  1015.     return 0;
  1016. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement