Advertisement
Guest User

Untitled

a guest
Oct 17th, 2019
121
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.60 KB | None | 0 0
  1. #include <time.h>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <memory.h>
  5. #include <string>
  6. #include <algorithm>
  7. using namespace std;
  8.  
  9. void sort_bubble(int *a, int n) {
  10. bool sorted = false;
  11. while (!sorted) {
  12. sorted = true;
  13. for (int i = 0; i < n-1; i++) {
  14. if (a[i] > a[i+1]) {
  15. int tmp = a[i];
  16. a[i] = a[i+1];
  17. a[i+1] = tmp;
  18. sorted = false;
  19. }
  20. }
  21. }
  22. }
  23.  
  24. void sort_shaker(int *a, int n) {
  25. bool sorted = false;
  26. int l = 0, r = n;
  27. while (!sorted) {
  28. sorted = true;
  29. for (int i = l; i < r-1; i++) {
  30. if (a[i] > a[i+1]) {
  31. int tmp = a[i];
  32. a[i] = a[i+1];
  33. a[i+1] = tmp;
  34. sorted = false;
  35. }
  36. }
  37. r--;
  38. if (sorted) break;
  39. sorted = true;
  40. for (int i = r-2; i >= l; i--) {
  41. if (a[i] > a[i+1]) {
  42. int tmp = a[i];
  43. a[i] = a[i+1];
  44. a[i+1] = tmp;
  45. sorted = false;
  46. }
  47. }
  48. l++;
  49. }
  50. }
  51.  
  52. void sort_bubble_traditional(int *a, int n) {
  53. bool sorted = false;
  54. for (int i = n-1; --n >- 0;) {
  55. for (int j = 0; j < i; j++) {
  56. if (a[j] > a[j+1]) {
  57. int tmp = a[j];
  58. a[j] = a[j+1];
  59. a[j+1] = tmp;
  60. }
  61. }
  62. }
  63. }
  64.  
  65. void sort_insertion(int *a, int n) {
  66. for (int i = n-1; i > 0; i--) {
  67. if (a[i-1] > a[i]) {
  68. int tmp = a[i-1]; a[i-1] = a[i]; a[i] = tmp;
  69. }
  70. }
  71. for (int i = 2; i < n; i++) {
  72. int j = i;
  73. int tmp = a[i];
  74. while (tmp < a[j-1]) {
  75. a[j] = a[j-1]; j--;
  76. }
  77. a[j] = tmp;
  78. }
  79. }
  80.  
  81. void sort_shell(int *a, int n) {
  82. int h;
  83. for (h = 1; h <= n / 9; h = 3*h + 1)
  84. ;
  85. for ( ; h > 0; h /= 3) {
  86. for (int i = h; i < n; i++) {
  87. int j = i;
  88. int tmp = a[i];
  89. while (j >= h && tmp < a[j-h]) {
  90. a[j] = a[j-h];
  91. j -= h;
  92. }
  93. a[j] = tmp;
  94. }
  95. }
  96. }
  97.  
  98.  
  99. void sort_shell2(int *a, int n) {
  100. static long long steps[] = {1, 8, 23, 77, 281, 1073, 4193, 16577, 65921, 262913, 1050113, 4197377, 16783361, 67121153, 268460033, 1073790977, 4295065601, 17180065793, 68719869953, 274878693377, 1099513200641, 4398049656833, 17592192335873, 70368756760577};
  101. int s;
  102. for (s = 0; steps[s] < n; s++)
  103. ;
  104. for (; --s >= 0; ) {
  105. int h = steps[s];
  106. for (int i = h; i < n; i++) {
  107. int j = i;
  108. int tmp = a[i];
  109. while (j >= h && tmp < a[j-h]) {
  110. a[j] = a[j-h];
  111. j -= h;
  112. }
  113. a[j] = tmp;
  114. }
  115. }
  116. }
  117.  
  118. void sort_shell3(int *a, int n) {
  119. int h = n/2;
  120. for ( ; h > 0; h /= 2) {
  121. for (int i = h; i < n; i++) {
  122. int j = i;
  123. int tmp = a[i];
  124. while (j >= h && tmp < a[j-h]) {
  125. a[j] = a[j-h];
  126. j -= h;
  127. }
  128. a[j] = tmp;
  129. }
  130. }
  131. }
  132.  
  133. void merge(int *a, int low, int mid, int high, int *aux) {
  134. int i,j;
  135. for (i = mid+1; i > low; i--) aux[i-1] = a[i-1];
  136. for (j = mid; j < high; j++) aux[high+mid-j]=a[j+1];
  137. for (int k = low; k <= high; k++) {
  138. if (aux[j] < aux[i])
  139. a[k] = aux[j--];
  140. else
  141. a[k] = aux[i++];
  142. }
  143. }
  144.  
  145. void mergeSort(int a[], int low, int high, int *aux) {
  146. const int THRESHOLD = 5;
  147. if (high - low < THRESHOLD) {
  148. sort_insertion(a+low, high-low+1);
  149. } else {
  150. int mid = (low + high) / 2;
  151. mergeSort(a, low, mid, aux);
  152. mergeSort(a, mid+1, high, aux);
  153. merge(a, low, mid ,high, aux);
  154. }
  155. }
  156.  
  157. void sort_merge(int *a, int n) {
  158. int *aux = new int[n];
  159. mergeSort(a,0,n-1, aux);
  160. delete [] aux;
  161. }
  162.  
  163. void quickSortBase(int *a, int l, int r) {
  164. int i = l, j = r;
  165. int pp[3] = { a[l], a[r], a[(l+r)>>1]};
  166. if (pp[0] < pp[1]) swap(pp[0],pp[1]);
  167. if (pp[1] < pp[2]) swap(pp[1],pp[2]);
  168. if (pp[0] < pp[1]) swap(pp[0],pp[1]);
  169. int p = pp[1];
  170. while (i <= j) {
  171. while (p > a[i])
  172. i++;
  173. while (a[j] > p)
  174. j--;
  175. if (i <= j) {
  176. int tmp = a[i];
  177. a[i] = a[j];
  178. a[j] = tmp;
  179. i++;
  180. j--;
  181. }
  182. }
  183. if (l < j)
  184. quickSortBase(a, l, j);
  185. if (i < r)
  186. quickSortBase(a, i, r);
  187. }
  188.  
  189. void sort_quick_recursive(int *a, int n) {
  190. quickSortBase(a,0,n-1);
  191. }
  192.  
  193. static void heapify(int *a, int i, int n)
  194. {
  195. int curr = a[i];
  196. int index = i;
  197. for (;;) {
  198. int left = index + index + 1;
  199. int right = left + 1;
  200. if ( left < n && a[left] > curr)
  201. index = left;
  202. if ( right < n && a[right] > a[index])
  203. index = right;
  204. if (index == i ) break;
  205. a[i] = a[index];
  206. a[index] = curr;
  207. i = index;
  208. }
  209. }
  210.  
  211. void sort_heap(int *a, int n) {
  212. for(int i = n/2-1; i >= 0; i--) {
  213. heapify(a, i, n);
  214. }
  215. while( n > 1 ) {
  216. n--;
  217. int tmp = a[0];
  218. a[0] = a[n];
  219. a[n] = tmp;
  220. heapify(a, 0, n);
  221. }
  222. }
  223.  
  224. void sort_exchange(int *a, int n) {
  225. for (int i = 0; i < n-1; i++) {
  226. int imin = i;
  227. for (int j = i+1; j < n; j++) {
  228. if (a[j] < a[imin]) imin = j;
  229. }
  230. int tmp = a[imin];
  231. a[imin] = a[i];
  232. a[i] = tmp;
  233. }
  234. }
  235.  
  236. void sort_vector(int *a, int n) {
  237. sort(a+0,a+n);
  238. }
  239.  
  240. int compare_int(const void *a, const void *b) {
  241. return *(const int *)a - *(const int *)b;
  242. }
  243.  
  244. void sort_qsort(int *a, int n) {
  245. qsort(a, n, sizeof(int), compare_int);
  246. }
  247.  
  248. typedef void(*sort_func)(int *a, int n);
  249.  
  250. struct sort_s {
  251. sort_func func;
  252. string name;
  253. } funcs [] = {
  254. {sort_bubble, "bubble_simple"},
  255. {sort_bubble_traditional, "bubble_trad"},
  256. {sort_shaker, "shaker"},
  257. {sort_insertion, "insertion"},
  258. {sort_exchange, "exchange"},
  259. {sort_shell, "shell"},
  260. {sort_shell2, "shell2"},
  261. {sort_shell3, "shell3"},
  262. {sort_merge, "merge"},
  263. {sort_heap, "heap"},
  264. {sort_quick_recursive, "quick recursive"},
  265. {sort_vector, "vector"},
  266. {sort_qsort, "qsort"},
  267. };
  268.  
  269. int main(int argc, char **argv) {
  270. string kind = "random";
  271. if (argc > 1 && argv[1] == string("random")) {
  272. kind = "random";
  273. argc--; argv++;
  274. }
  275. if (argc > 1 && argv[1] == string("ascend")) {
  276. kind = "ascend";
  277. argc--; argv++;
  278. }
  279. if (argc > 1 && argv[1] == string("descend")) {
  280. kind = "descend";
  281. argc--; argv++;
  282. }
  283. int start_alg = 0;
  284. if (argc > 1 && argv[1] == string("fastest")) {
  285. argc--; argv++;
  286. start_alg = 5;
  287. }
  288. int n = 100000;
  289. if (argc > 1) {
  290. n = atoi(argv[1]);
  291. }
  292. int *copya = new int[n];
  293. if (kind == "random") {
  294. srand(time(NULL));
  295. for (int i = 0; i < n; i++) {
  296. copya[i] = rand();
  297. }
  298. } else if (kind == "ascend") {
  299. for (int i = 0; i < n; i++) {
  300. copya[i] = i * 2;
  301. }
  302. } else if (kind == "descend") {
  303. for (int i = 0; i < n; i++) {
  304. copya[i] = n*2 - i*2;
  305. }
  306. }
  307. int *a = new int[n];
  308. for (int alg = start_alg; alg < sizeof funcs/sizeof funcs[0]; alg++) {
  309. memcpy(a, copya, n * sizeof a[0]);
  310. printf("%30s: ", funcs[alg].name.c_str()); fflush(stdout);
  311. clock_t start = clock();
  312. funcs[alg].func(a, n);
  313. clock_t end = clock();
  314. printf("%.3f seconds\n", (end - start) / (double)CLOCKS_PER_SEC);
  315. for (int i = 0; i < n-1; i++) {
  316. if (a[i] > a[i+1]) {
  317. printf("sort failed: a[%d]=%d a[%d]=%d\n", i, a[i], i+1, a[i+1]);
  318. break;
  319. }
  320. }
  321. }
  322. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement