Advertisement
MRX321321

Untitled

Dec 14th, 2020
30
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.47 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <time.h>
  4. long long N;
  5. int permutation_count;
  6. clock_t start,end;
  7. void mergesort(int a[],int i,int j);
  8. void merge(int a[],int i1,int j1,int i2,int j2);
  9.  
  10. void output(int n, int a[]){
  11. for (int i = 0; i < n; ++i) printf("%d ", a[i]);
  12. printf("Permutation count = %d", permutation_count);
  13. }
  14.  
  15. void generate(int n, int a[]){
  16. for (int i = 0; i < n; ++i) a[i] = rand() % 100;
  17. permutation_count = 0;
  18. }
  19.  
  20. int check(int n, int a[]){
  21. for(int i = 1; i < n; ++i)
  22. return (a[i] < a[i-1]) ? 0 : 1;
  23. }
  24.  
  25. void clocker() {
  26. clock_t end = clock();
  27. printf("Elapsed: %lf seconds", (double)(end - start) / CLOCKS_PER_SEC);
  28. }
  29. void NeymanSort(int n, int a[]){
  30.  
  31. int b[n], c[n], b_size = 0, c_size = 0;
  32. if (check(n, a)) return;
  33. for (int i = 0; i < n; ++i){
  34. if (b_size == 0 || b[b_size - 1] <= a[i]) {b[b_size] = a[i]; b_size++;}
  35. else if (c_size == 0 || c[c_size - 1] <= a[i]) {c[c_size] = a[i]; c_size++;}
  36. else if (b[b_size - 1] >= c[c_size - 1]) {permutation_count++; b[b_size] = a[i]; b_size++;}
  37. else {c[c_size] = a[i]; c_size++;}
  38. }
  39.  
  40. int b_pointer = 0, c_pointer = 0;
  41. for (int i = 0; i < n; ++i){
  42. if (c_pointer == c_size || b[b_pointer] <= c[c_pointer]) {a[i] = b[b_pointer]; ++b_pointer;}
  43. else {a[i] = c[c_pointer]; ++c_pointer; permutation_count++;}
  44. }
  45.  
  46. NeymanSort(n, a);
  47. }
  48. void BoseNelsonMerge(int l, int r, int step, int n, int a[]){
  49. if (l + r < n){
  50. if (step == 1){
  51. if (a[l] > a[l + r]){
  52. int tmp = a[l];
  53. a[l] = a[l + r];
  54. a[l + r] = tmp;
  55. permutation_count++;
  56. }
  57. }
  58. else {
  59. step = step / 2;
  60. BoseNelsonMerge(l, r, step, n, a);
  61. if (l + r + step < n)
  62. BoseNelsonMerge(l + step, r, step, n, a);
  63. BoseNelsonMerge(l + step, r - step, step, n, a);
  64. }
  65. }
  66. }
  67.  
  68.  
  69. void BoseNelsonSort(int n, int a[]){
  70. int m = 1;
  71. while (m < n){
  72. int j = 0;
  73. while (j + m < n){
  74. BoseNelsonMerge(j, m, m, n, a);
  75. j += m + m;
  76. }
  77. m += m;
  78. }
  79.  
  80. }
  81.  
  82. void mergesort(int a[],int i,int j)
  83. {
  84. int mid;
  85.  
  86. if(i<j)
  87. {
  88. mid=(i+j)/2;
  89. mergesort(a,i,mid);
  90. mergesort(a,mid+1,j);
  91. merge(a,i,mid,mid+1,j);
  92. }
  93. }
  94.  
  95. void merge(int a[],int i1,int j1,int i2,int j2)
  96. {
  97. int temp[N];
  98. int i,j,k;
  99. i=i1;
  100. j=i2;
  101. k=0;
  102.  
  103. while(i<=j1 && j<=j2)
  104. {
  105. if(a[i]<a[j]){
  106. temp[k++] = a[i++];
  107. permutation_count++;
  108. }
  109. else {
  110. temp[k++] = a[j++];
  111. }
  112. }
  113.  
  114. while(i<=j1)
  115. temp[k++]=a[i++];
  116.  
  117. while(j<=j2)
  118. temp[k++]=a[j++];
  119.  
  120. for(i=i1,j=0;i<=j2;i++,j++)
  121. a[i]=temp[j];
  122. }
  123.  
  124. int menu (int a[]) {
  125. int t;
  126. while(1){
  127. printf("Menu: \n");
  128. printf("1. Generate array \n");
  129. printf("2. Merge Sort\n");
  130. printf("3. NeymanSort\n");
  131. printf("4. BoseNelsonSort\n");
  132. printf("5. Print\n");
  133. printf("6. Exit\n");
  134. scanf("%d",&t);
  135. if(t==1) {
  136. generate(N, a);
  137. printf("Done!");
  138. printf("\nPermutation count = %d\n", permutation_count);
  139. }
  140. else if(t==2) {
  141. start = clock();
  142. mergesort(a,0,N-1);
  143. printf("Sorted!\n");
  144. clocker();
  145. printf("\nPermutation count = %d\n", permutation_count);
  146. }
  147. else if(t==3) {
  148. start = clock();
  149. NeymanSort(N,a);
  150. printf("Sorted!\n");
  151. clocker();
  152. printf("\nPermutation count = %d\n", permutation_count);
  153. }
  154. else if(t==4) {
  155. start = clock();
  156. BoseNelsonSort(N, a);
  157. printf("Sorted!\n");
  158. clocker();
  159. printf("\nPermutation count = %d\n", permutation_count);
  160. }
  161. else if(t==5) {
  162. printf("Array: ");
  163. output(N, a);
  164. printf("\n");
  165. permutation_count = 0;
  166. }
  167. else if(t==6) {
  168. return 0;
  169. }
  170. else {
  171. printf("Please select an item from the suggested!\n");
  172. }
  173. }
  174. }
  175.  
  176. int main(void) {
  177. srand(time(NULL));
  178. printf("Enter the value of array - ");
  179. scanf("%lld",&N);
  180. int a[N];
  181. menu(a);
  182. return 0;
  183. }
  184.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement