Advertisement
Guest User

Untitled

a guest
Mar 26th, 2015
198
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.67 KB | None | 0 0
  1. #include <iostream>
  2. #include <ctime>
  3. #include <cstdio>
  4. #include <windows.h>
  5. #include <algorithm>
  6.  
  7.  
  8. #define SIZE (1<<22)
  9. #define MAX_RAND 10
  10.  
  11. void sort(int []);
  12. void merge(int [],int, int, int);
  13. void tiledmergesort( int [] , int , int );
  14. double timeMERGESORT( int [] );
  15.  
  16.  
  17.  
  18. int main()
  19. {
  20. srand(time(NULL));
  21. long long int i;
  22. int* data = new int[SIZE];
  23. int* data_copy = new int[SIZE];
  24.  
  25. for ( i = 0 ; i < SIZE ; ++i )
  26. {
  27. data[i] = rand() % MAX_RAND;
  28. data_copy[i] = data[i];
  29. }
  30.  
  31. //std::cout<<"insertion sort : "<<timeINSERTION( data )<<std::endl;
  32.  
  33. for ( i = 0 ; i < SIZE ; ++i )
  34. {
  35. data[i] = data_copy[i];
  36. }
  37.  
  38.  
  39.  
  40.  
  41.  
  42. std::cout<<"mergesort : "<<timeMERGESORT( data )<<std::endl;
  43.  
  44. return 0;
  45. }
  46.  
  47.  
  48.  
  49.  
  50.  
  51. double timeMERGESORT( int array[] )
  52. {
  53. LARGE_INTEGER ticksPerSecond;
  54. LARGE_INTEGER tick1;
  55. LARGE_INTEGER tick2;
  56.  
  57. LARGE_INTEGER time1;
  58. LARGE_INTEGER time2;
  59.  
  60. QueryPerformanceFrequency(&ticksPerSecond);
  61. QueryPerformanceCounter(&tick1);
  62.  
  63. double start = double(tick1.QuadPart)/ticksPerSecond.QuadPart;
  64.  
  65. sort( array );
  66.  
  67. QueryPerformanceCounter(&tick2);
  68.  
  69. double end = double(tick2.QuadPart)/ticksPerSecond.QuadPart;
  70. double diff = end - start;
  71.  
  72. return (diff);
  73. }
  74.  
  75. void sort( int array[] )
  76. {
  77. int width;
  78.  
  79. for ( width = 1; width < SIZE; width = 2*width )
  80. {
  81. // Combine pairs of array a of width "width"
  82. int i;
  83.  
  84. for ( i = 0; i < SIZE; i = i + 2*width )
  85. {
  86. int left, middle, right;
  87.  
  88. left = i;
  89. middle = i + width;
  90. right = i + 2*width;
  91.  
  92. merge( array, left, middle, right );
  93.  
  94. }
  95. }
  96. }
  97.  
  98. void merge(int a[] , int iLeft , int iMiddle, int iRight )
  99. {
  100. int i, j, k;
  101. int* tmp = new int[SIZE];
  102.  
  103. i = iLeft; // Re-adjust the indices
  104. j = iMiddle;
  105. k = iLeft;
  106.  
  107. while ( i < iMiddle || j < iRight ) // It's the same algorithm !
  108. {
  109. if ( i < iMiddle && j < iRight )
  110. { // Both array have elements
  111. if ( a[i] < a[j] )
  112. tmp[k++] = a[i++];
  113. else
  114. tmp[k++] = a[j++];
  115. }
  116. else if ( i == iMiddle )
  117. tmp[k++] = a[j++]; // a is empty
  118. else if ( j == iRight )
  119. tmp[k++] = a[i++]; // b is empty
  120. }
  121.  
  122. /* =================================
  123. Copy tmp[] back to a[]
  124. ================================= */
  125. for ( i = iLeft; i < iRight; i++ )
  126. a[i] = tmp[i];
  127.  
  128. delete[] tmp;
  129. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement