Advertisement
Guest User

Untitled

a guest
Apr 25th, 2017
56
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.86 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <stdbool.h>
  5.  
  6. #define NUM 9 // array length for sorting
  7. #define MAX 27 // max number in the array
  8.  
  9. int list[NUM];
  10. void display();
  11. void bubbleSort();
  12. void insertionSort();
  13. void selectionSort();
  14. void mergeSort();
  15. void shellSort();
  16. void quickSort();
  17. void heapSort();
  18.  
  19. int main()
  20. {
  21. for (int i = 0; i < NUM; i++) {
  22. list[i] = rand() % MAX;
  23. }
  24. printf("Input: \n");
  25. display();
  26. printf("\n");
  27.  
  28. // bubbleSort();
  29. // insertionSort();
  30. // selectionSort();
  31. mergeSort();
  32. // shellSort();
  33. // quickSort();
  34. // heapSort();
  35. printf("Output: \n");
  36. display();
  37. }
  38.  
  39. void display()
  40. {
  41. // navigate througt all numbers
  42. for (int i = 0; i < NUM; i++) {
  43. printf("%2d ", list[i]);
  44. for (int j = 0; j < list[i]; j++) {
  45. printf("*");
  46. }
  47. printf("\n");
  48. }
  49. }
  50.  
  51. void bubbleSort()
  52. {
  53. int i, j, temp;
  54. bool swapped = false;
  55.  
  56. // loop through all numbers
  57. for (i = 0; i < NUM-1; i++) {
  58. swapped = false;
  59.  
  60. // loop through numbers falling ahead
  61. for (j = 0; j < NUM-1-i; j++) {
  62. // check if next number is less than current number
  63. // swap the numbers (bubble up)
  64. if (list[j] > list[j+1]) {
  65. temp = list[j];
  66. list[j] = list[j+1];
  67. list[j+1] = temp;
  68. swapped = true;
  69. } else {
  70. swapped = true;
  71. }
  72. // if no numbers was swapped that means array is sorted
  73. if (!swapped) {
  74. break;
  75. }
  76. }
  77. // print the sorting process
  78. printf("Iteration #%d: \n", i+1);
  79. display();
  80. printf("\n");
  81. }
  82. }
  83.  
  84. void insertionSort()
  85. {
  86. int i, valueToInsert, holePosition;
  87.  
  88. // loop through all numbers
  89. for (i = 0; i < NUM; i++) {
  90. // select the value to be inserted
  91. valueToInsert = list[i];
  92. // select the hole position where the number is to be inserted
  93. holePosition = i;
  94.  
  95. // check if previous number is larger than the number to be inserted
  96. while (holePosition > 0 && list[holePosition-1] > valueToInsert) {
  97. list[holePosition] = list[holePosition-1];
  98. holePosition--;
  99. }
  100. if (holePosition != i) {
  101. list[holePosition] = valueToInsert;
  102. }
  103. // print the sorting process
  104. printf("Iteration #%d: \n", i+1);
  105. display();
  106. printf("\n");
  107. }
  108. }
  109.  
  110. void selectionSort()
  111. {
  112. int i, j, indexMin, temp;
  113.  
  114. // loop through all numbers
  115. for (i = 0; i < NUM-1; i++) {
  116. // set current number as minimum
  117. indexMin = i;
  118. // check the number is the minimum
  119. for (j = i+1; j < NUM; j++) {
  120. if (list[j] < list[indexMin]) {
  121. indexMin = j;
  122. }
  123. }
  124.  
  125. if (indexMin != i) {
  126. temp = list[indexMin];
  127. list[indexMin] = list[i];
  128. list[i] = temp;
  129. }
  130. // print the sorting process
  131. printf("Iteration #%d: \n", i+1);
  132. display();
  133. printf("\n");
  134. }
  135. }
  136.  
  137. void mergeSort()
  138. {
  139. void merging(int left, int mid, int right) {
  140. int size = right - left + 1;
  141. int temp[size];
  142. int i, l1, l2;
  143. for (l1 = left, l2 = mid + 1, i = left; l1 <= mid && l2 <= right; i++) {
  144. if (list[l1] <= list[l2])
  145. temp[i] = list[l1++];
  146. else
  147. temp[i] = list[l2++];
  148. }
  149. while (l1 <= mid)
  150. temp[i++] = list[l1++];
  151. while (l2 <= right)
  152. temp[i++] = list[l2++];
  153. for (i = left; i <= right; i++)
  154. list[i] = temp[i];
  155. // print the sorting process
  156. display();
  157. printf("\n");
  158. }
  159. void sort(int left, int right) {
  160. int mid;
  161. if (left < right) {
  162. mid = (left + right) / 2;
  163. printf("sort: %d %d sort: %d %d \n", left, mid, mid+1, right);
  164. sort(left, mid);
  165. sort(mid+1, right);
  166. printf("mergeing: %d %d %d \n", left, mid, right);
  167. merging(left, mid, right);
  168. }
  169. }
  170. sort(0, NUM-1);
  171. }
  172.  
  173. void shellSort()
  174. {
  175. int i = 0, inner, outer, valueToInsert, interval = 1;
  176. while (interval < NUM/3) {
  177. interval = interval*3 + 1;
  178. }
  179. while (interval > 0) {
  180. // print sorting process
  181. // display();
  182.  
  183. for (outer = interval; outer < NUM; outer++) {
  184. valueToInsert = list[outer];
  185. inner = outer;
  186. while (inner > interval - 1 && list[inner - interval] >= valueToInsert) {
  187. list[inner] = list[inner - interval];
  188. inner -= interval;
  189. }
  190. list[inner] = valueToInsert;
  191. }
  192. interval = (interval - 1) / 3;
  193. i++;
  194. }
  195. }
  196.  
  197. void quickSort()
  198. {
  199. void swap(int num1, int num2) {
  200. int temp = list[num1];
  201. list[num1] = list[num2];
  202. list[num2] = temp;
  203. }
  204. int partition(int left, int right, int pivot) {
  205. int leftPointer = left -1;
  206. int rightPointer = right;
  207.  
  208. while (true) {
  209. while(list[++leftPointer] < pivot) {}
  210. while(rightPointer > 0 && list[--rightPointer] > pivot) {}
  211. if (leftPointer >= rightPointer) {
  212. break;
  213. } else {
  214. swap(leftPointer, rightPointer);
  215. }
  216. }
  217.  
  218. swap(leftPointer, right);
  219. // print sorting process
  220. // display();
  221. return leftPointer;
  222. }
  223. void sorting(int left, int right) {
  224. if (right-left <= 0) {
  225. return;
  226. } else {
  227. int pivot = list[right];
  228. int partitionPoint = partition(left, right, pivot);
  229. sorting(left, partitionPoint - 1);
  230. sorting(partitionPoint + 1, right);
  231. }
  232. }
  233. sorting(0, NUM-1);
  234. }
  235.  
  236. void heapSort()
  237. {
  238. void heapify(int a[], int n) {
  239. int i, j, k, item;
  240. for (k = 1; k < n; k++) {
  241. item = a[k];
  242. i = k;
  243. j = (i-1)/2;
  244. while (i > 0 && item > a[j]) {
  245. a[i] = a[j];
  246. i = j;
  247. j = (i-1)/2;
  248. }
  249. a[i] = item;
  250. }
  251. }
  252. void adjust(int a[], int n) {
  253. int i, j, item;
  254. j = 0;
  255. item = a[j];
  256. i = 2*j + 1;
  257. while (i <= n-1) {
  258. if (i+1 <= n-1) {
  259. if (a[i] < a[i+1]) {
  260. i++;
  261. }
  262. }
  263. if (item < a[i]) {
  264. a[j] = a[i];
  265. j = i;
  266. i = 2*j +1;
  267. } else {
  268. break;
  269. }
  270. }
  271. a[j] = item;
  272. }
  273. void sorting(int a[], int n) {
  274. int i, t;
  275. heapify(a, n);
  276. for (i = n - 1; i > 0; i--) {
  277. t = a[0];
  278. a[0] = a [i];
  279. a[i] = t;
  280. adjust(a, i);
  281. }
  282. }
  283. sorting(list, NUM);
  284. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement