Advertisement
Guest User

Untitled

a guest
Mar 28th, 2020
86
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 5.43 KB | None | 0 0
  1. #define _XOPEN_SOURCE
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <time.h>
  5.  
  6. typedef void (*gen)(int*, int);
  7. void generate_random(int*, int);
  8. void generate_sorted(int*, int);
  9. void generate_sorted_reverse(int*, int);
  10. void generate_almost_sorted(int*, int);
  11. void generate_almost_sorted_reverse(int*, int);
  12. void insertionSort(int*, int);
  13. void printArray(int*, int);
  14. double timetest (int*, int, gen);
  15.  
  16. inline
  17. void swap(int* a, int* b) {
  18. int tmp = *a;
  19. *a = *b;
  20. *b = tmp;
  21. }
  22. int compare (const void * a, const void * b)
  23. {
  24.   return ( *(int*)a - *(int*)b );
  25. }
  26.  
  27. void generate_random(int* arr, int n) {
  28. // You can experiment with the modulo value.
  29. // The bigger number the less duplicates in the array.
  30. int i;
  31. for(i = 0; i < n; ++i) arr[i] = lrand48() % 1000000;
  32. }
  33.  
  34. void generate_sorted(int* arr, int n) {
  35.     int i;
  36. for(i = 0; i < n; ++i) arr[i] = i;
  37. }
  38.  
  39. void generate_sorted_reverse(int* arr, int n) {
  40.     int i;
  41. for(i = 0; i < n; ++i) arr[i] = n - i;
  42. }
  43.  
  44. void generate_almost_sorted(int* arr, int n) {
  45. // initialize sorted array
  46. int i;
  47. for(i = 0; i < n; ++i) arr[i] = i;
  48. // Make some swaps to disturb the order
  49. // Experiment with different # of swaps
  50. int g;
  51. for(g = 0; g < 100; ++g) {
  52. int j = lrand48() % n;
  53. int k = lrand48() % n;
  54. while(j == k) k = lrand48() % n;
  55. swap(&arr[j], &arr[k]);
  56. }
  57. }
  58.  
  59. void generate_almost_sorted_reverse(int* arr, int n) {
  60. // initialize array sorted in reverse order
  61. int i;
  62. for(i = 0; i < n; ++i) arr[i] = n - i;
  63. // Make some swaps to disturb the order
  64. // Experiment with different # of swaps
  65. int g;
  66. for(g = 0; g < 100; ++g) {
  67. int j = lrand48() % n;
  68. int k = lrand48() % n;
  69. while(j == k) k = lrand48() % n;
  70. swap(&arr[j], &arr[k]);
  71. }
  72. }
  73.  
  74. void insertionSort(int* arr, int n) {
  75.     int i;
  76. for(i = 1; i < n; ++i) {
  77. int x = arr[i];
  78. int j = i - 1;
  79. while(j >= 0 && arr[j] > x) {
  80. arr[j+1] = arr[j];
  81. --j;
  82. }
  83. arr[j+1] = x;
  84. }
  85. }
  86.  
  87. void Change(int arr[], int x1, int x2){ //swap
  88.     int temp=arr[x1];
  89.     arr[x1]=arr[x2];
  90.     arr[x2]=temp;
  91. }
  92. int Pdivision(int l , int r){
  93.     return (l+(r-1))/2;
  94. }
  95. int Pdivision_r(int l , int r){
  96.     //srand(time(NULL));
  97.     return l + lrand48() % (r - l);
  98. }
  99. int Pdivision_median_of_three (int l , int r){
  100.     int one = l + lrand48() % (r - l);
  101.     int two = l + lrand48() % (r - l);
  102.     int three =  l + lrand48() % (r - l);
  103.     if((two <= one && one <= three) || (two >= one && one >= three)) return one;
  104.     if((one <= two && two <= three) || (one >= two && two >= three)) return two;
  105.     if((two <= three && three <= one) || (two >= three && three >= one)) return three;
  106.     return 0;
  107. }
  108. // int Pdivision_classic( int l, int r){   // nie działa nwm czemu, dla tego przypadku jest osobno quickSort ponizej
  109.   //  return r;                              // l podaje tylko dlatego, żeby zmieniać tylko i wyłącznie nazwe funkcji , lenistwo
  110. //}
  111. int Division(int arr[], int l, int r){
  112.     int key = Pdivision_r(l,r);
  113.     int val = arr[key];
  114.     Change(arr, key, r);    // Swap
  115.     int curr=l;
  116.     for(int i=l;i<r;i++){
  117.         if(arr[i]<val){
  118.             Change(arr, i, curr);
  119.             curr+=1;
  120.         }
  121.     }
  122.     Change(arr, curr, r);
  123.     return curr;
  124. }
  125. void Quicksort(int arr[], int l , int r){
  126.     if(l<r){
  127.         int i = Division(arr, l, r);
  128.         Quicksort(arr, l, i);
  129.         Quicksort(arr, i+1, r);
  130.     }
  131. }
  132. // to dla przypadku gdy pivot to skrajnie największy indeks
  133.  
  134. /*int partition (int arr[], int low, int high)
  135. {
  136.     int pivot = arr[high]; // pivot
  137.     int i = (low - 1); // Index of smaller element
  138.  
  139.     for (int j = low; j <= high - 1; j++)
  140.     {
  141.         // If current element is smaller than the pivot
  142.         if (arr[j] < pivot)
  143.         {
  144.             i++; // increment index of smaller element
  145.             swap(&arr[i], &arr[j]);
  146.         }
  147.     }
  148.     swap(&arr[i + 1], &arr[high]);
  149.     return (i + 1);
  150. }
  151.  
  152. void quickSort(int arr[], int low, int high)
  153. {
  154.     if (low < high)
  155.     {
  156.         int pi = partition(arr, low, high);
  157.         quickSort(arr, low, pi - 1);
  158.         quickSort(arr, pi + 1, high);
  159.     }
  160. }*/
  161.  
  162. void printArray(int* arr, int n) {
  163.     int i;
  164. for (i = 0; i < n; ++i)
  165. printf("%d ", arr[i]);
  166. printf("\n");
  167. }
  168.  
  169. double timetest (int* arr, int n, gen fgen) {
  170.  
  171. clock_t t0, t1;
  172. fgen(arr, n);
  173.  
  174. // Wait for clock() roll over before starting
  175. t0 = clock();
  176. while (t0 == (t1 = clock()));
  177.  
  178. t0 = t1;
  179. //qsort(arr, n, sizeof(int), compare);    //funkcja wbudowana
  180. Quicksort(arr, 0, n-1);                 // moja funkcja do pivotów średnia, rand i median_of_3
  181. //quickSort(arr, 0, n - 1);             // do pivota skrajnie najwiekszy indeks
  182. t1 = clock();
  183.  
  184. return (t1 - t0) * (1.0 / CLOCKS_PER_SEC);
  185. }
  186.  
  187. int main() {
  188. int n;
  189. printf("\n");
  190. //printf("Enter n: ");
  191. scanf("%d", &n);
  192.  
  193. // allocate array
  194. int *arr = malloc(n * sizeof(int));
  195. if(!arr) {
  196. printf("allocation failed\n");
  197. exit(1);
  198. }
  199.  
  200. // initialize the randomizer
  201. srand48(time(0));
  202.  
  203. // sort sample arrays
  204. double d1 = timetest(arr, n, generate_random);
  205. double d2 = timetest(arr, n, generate_sorted);
  206. double d3 = timetest(arr, n, generate_almost_sorted);
  207. double d4 = timetest(arr, n, generate_sorted_reverse);
  208. double d5 = timetest(arr, n, generate_almost_sorted_reverse);
  209.  
  210. printf("%f\n", /*"Random",*/ d1*1000);
  211. printf("%f\n", /*"Sorted",*/ d2*1000);
  212. printf("%f\n", /*"Almost Sorted",*/ d3*1000);
  213. printf("%f\n", /*"Sorted (reverse)",*/ d4*1000);
  214. printf("%f\n", /*"Almost Sorted (reverse)",*/ d5*1000);
  215.  
  216. // free memory
  217. free(arr);
  218.  
  219. return 0;
  220. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement