Advertisement
Guest User

Untitled

a guest
Dec 17th, 2014
171
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 9.33 KB | None | 0 0
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<time.h>
  4. #define SIZE 50
  5.  
  6. #define SIZE1 1000
  7. #define SIZE2 10000
  8. #define SIZE3 1000000
  9.  
  10.  
  11. int arrLen;
  12. int indOfStart;
  13.  
  14. typedef struct Node Node;
  15. typedef struct Heap Heap;
  16.  
  17.  
  18. struct Heap
  19. {
  20.     int size;
  21.     int maxSize;
  22.     int* elements;
  23. };
  24.  
  25.  
  26. void swapForChar(char* x, char* y)
  27. {
  28.     char tmp = *x;
  29.     *x = *y;
  30.     *y = tmp;
  31. }
  32.  
  33. void swap(void* x, void* y, size_t size)
  34. {
  35.     char* x1 = (char*) x;
  36.     char* y1 = (char*) y;
  37.     int i;
  38.     for (i = 0; i < size; ++i)
  39.     {
  40.         swapForChar(x1 + i, y1 + i);
  41.     }
  42.     x = (void*) x1;
  43.     y = (void*) y1;
  44. }
  45.  
  46. int max(int a, int b)
  47. {
  48.     if (a > b)
  49.     {
  50.         return a;
  51.     }
  52.     return b;
  53. }
  54.  
  55.  
  56. int* getLeftChild(Heap* myheap, int ind)
  57. {
  58.     if (ind * 2 + 1 < myheap->size)
  59.     {
  60.         return &myheap->elements[ind * 2 + 1];
  61.     }
  62.     return NULL;
  63. }
  64.  
  65.  
  66. int* getRightChild(Heap* myheap, int ind)
  67. {
  68.     if (ind * 2 + 2 < myheap->size)
  69.     {
  70.         return &myheap->elements[ind * 2 + 2];
  71.     }
  72.     return NULL;
  73. }
  74.  
  75.  
  76. int* getParent(Heap* myheap, int ind)
  77. {
  78.     if (ind != 0)
  79.     {
  80.         return &myheap->elements[(ind - 1) / 2];
  81.     }
  82.     return NULL;
  83. }
  84.  
  85. void siftDown(Heap* myheap, int ind)
  86. {
  87.     int* leftChild = getLeftChild(myheap, ind);
  88.     int* rightChild = getRightChild(myheap, ind);
  89.  
  90.     if (leftChild != NULL && rightChild == NULL)
  91.     {
  92.         if (*leftChild > myheap->elements[ind])
  93.         {
  94.             swap(leftChild, &myheap->elements[ind], sizeof(leftChild));
  95.         }
  96.     }
  97.     if (rightChild != NULL)
  98.     {
  99.         if (max(myheap->elements[ind], *rightChild) < *leftChild)
  100.         {
  101.             swap(&myheap->elements[ind], leftChild, sizeof(leftChild));
  102.             siftDown(myheap, ind * 2 + 1);
  103.         }
  104.         if (max(myheap->elements[ind], *leftChild) < *rightChild)
  105.         {
  106.             swap(&myheap->elements[ind], rightChild, sizeof(rightChild));
  107.             siftDown(myheap, ind * 2 + 2);
  108.         }
  109.     }
  110. }
  111.  
  112.  
  113. void extractMax(Heap* myheap)
  114. {
  115.     if (myheap->size == 0)
  116.     {
  117.         printf("error");
  118.     }
  119.     else
  120.     {
  121.         swap(&myheap->elements[0], &myheap->elements[myheap->size - 1], sizeof(int*));
  122.         --myheap->size;
  123.         siftDown(myheap, 0);
  124.     }
  125.  
  126. }
  127.  
  128. int getMaximum(Heap* myheap)
  129. {
  130.     return myheap->elements[0];
  131. }
  132.  
  133.  
  134. Heap* buildHeap(int* array)
  135. {
  136.     Heap* myheap = (Heap*) malloc(sizeof(Heap));
  137.     myheap->size = arrLen;
  138.     myheap->maxSize = arrLen;
  139.     myheap->elements = array;
  140.  
  141.     int i;
  142.     for (i = arrLen / 2; i >= 0; --i)
  143.     {
  144.         siftDown(myheap, i);
  145.     }
  146.     return myheap;
  147. }
  148.  
  149. void heapSort(int* array)
  150. {
  151.     Heap* myheap = buildHeap(array);
  152.     int* res = (int*) malloc(arrLen * sizeof(int));
  153.     int i;
  154.     for (i = arrLen - 1; i >= 0; --i)
  155.     {
  156.         res[i] = getMaximum(myheap);
  157.         extractMax(myheap);
  158.     }
  159. }
  160.  
  161.  
  162. int partition(int* a, int left, int right, int pivot)
  163. {
  164.     swap(&a[right], &a[pivot], sizeof(int));
  165.     int PivotInd = right;
  166.     --right;
  167.     int PivotValue = a[PivotInd];
  168.  
  169.     while (left < right)
  170.     {
  171.  
  172.         while (a[left] <= PivotValue && left < right)
  173.         {
  174.             ++left;
  175.         }
  176.         while (a[right] >= PivotValue && left < right)
  177.         {
  178.             --right;
  179.         }
  180.         swap(&a[left], &a[right], sizeof(int));
  181.  
  182.         if (left + 1 == right)
  183.         {
  184.             break;
  185.         }
  186.         if (right - left > 1)
  187.         {
  188.             ++left;
  189.             --right;
  190.         }
  191.     }
  192.  
  193.     if (a[right] >= PivotValue)
  194.     {
  195.         swap(&a[right], &a[PivotInd], sizeof(int));
  196.         PivotInd = right;
  197.     }
  198.     else
  199.     {
  200.         swap(&a[right + 1], &a[PivotInd], sizeof(int));
  201.         PivotInd = right + 1;
  202.     }
  203.     return PivotInd;
  204. }
  205.  
  206. void quickSort(int* a, int left, int right)
  207. {
  208.     if (right - left > 0)
  209.     {
  210.         int pivot = partition(a, left, right, right);
  211.         quickSort(a, left, pivot - 1);
  212.         quickSort(a, pivot + 1, right);
  213.     }
  214. }
  215.  
  216.  
  217.  
  218. void merge(int** array, int left, int middle, int right)
  219. {
  220.     int i = 0;
  221.     int j = 0;
  222.  
  223.     while (left + i < middle && middle + j < right)
  224.     {
  225.         if (array[0][left + i] < array[0][middle + j])
  226.         {
  227.             array[1][i + j] = array[0][left + i];
  228.             ++i;
  229.         }
  230.         else
  231.         {
  232.             array[1][i + j] = array[0][middle + j];
  233.             ++j;
  234.         }
  235.     }
  236.     while (left + i < middle)
  237.     {
  238.         array[1][i + j] = array[0][left + i];
  239.         ++i;
  240.     }
  241.     while (middle + j < right)
  242.     {
  243.         array[1][i + j] = array[0][middle + j];
  244.         ++j;
  245.     }
  246.     int ind;
  247.     for (ind = 0; ind < (right - left); ++ind)
  248.     {
  249.         array[0][left + ind] = array[1][ind];
  250.     }
  251. }
  252.  
  253.  
  254.  
  255. void mergeSort(int** array, int left, int right)
  256. {
  257.     if (right - left > 1)
  258.     {
  259.         int middle = (left + right) / 2;
  260.         mergeSort(array, left, middle);
  261.         mergeSort(array, middle, right);
  262.  
  263.         merge(array, left, middle, right);
  264.     }
  265. }
  266.  
  267.  
  268.  
  269. int* getSequence()
  270. {
  271.     int* seq = (int*) malloc(SIZE * sizeof(int));
  272.     int* tmp;
  273.     int maxLength = SIZE;
  274.     seq[0] = 1;
  275.     int i = 1;
  276.     while (seq[i - 1] < arrLen)
  277.     {
  278.         if (i >= maxLength)
  279.         {
  280.  
  281.             tmp = (int*) realloc(seq, maxLength * 2 * sizeof(int));
  282.             if (tmp == NULL)
  283.             {
  284.                 return NULL;
  285.             }
  286.             else
  287.             {
  288.                 seq = tmp;
  289.                 maxLength = maxLength * 2;
  290.             }
  291.         }
  292.         seq[i] = seq[i - 1] * 2 + 1;
  293.         ++i;
  294.     }
  295.     indOfStart = i - 2;
  296.     return seq;
  297. }
  298.  
  299. void hSort(int* array, int h)
  300. {
  301.     int i, ind;
  302.     for (i = 1; i < arrLen; i = i + h)
  303.     {
  304.         ind = i;
  305.  
  306.         while (ind >= h && array[ind] < array[ind - h])
  307.         {
  308.             swap(&array[ind], &array[ind - h], sizeof(array[ind]));
  309.             ind = ind - h;
  310.         }
  311.     }
  312. }
  313.  
  314. void shellSort(int* array)
  315. {
  316.     int* seq = getSequence();
  317.     int i;
  318.     for (i = indOfStart; i >= 0; --i)
  319.     {
  320.         hSort(array, seq[i]);
  321.     }
  322.     free(seq);
  323. }
  324.  
  325.  
  326. void bubble(int* a)
  327. {
  328.     int i, j;
  329.     for (i = 0; i < arrLen; ++i)
  330.     {
  331.         for (j = 0; j < (arrLen - i - 1); ++j)
  332.         {
  333.             if (a[j] > a[j + 1])
  334.             {
  335.                 swap(&a[j], &a[j + 1], sizeof(a[j]));
  336.             }
  337.         }
  338.     }
  339.  
  340. }
  341.  
  342.  
  343. int* getSortedArray(int length)
  344. {
  345.     int* a = (int*) malloc(length * sizeof(int));
  346.     int i;
  347.     for (i = 0; i < length; ++i)
  348.     {
  349.         a[i] = i;
  350.     }
  351.     return a;
  352. }
  353.  
  354.  
  355. int* getReversedArray(int length)
  356. {
  357.     int* a = (int*) malloc(length * sizeof(int));
  358.     int i;
  359.     for (i = 0; i < length; ++i)
  360.     {
  361.         a[i] = length - i;
  362.     }
  363.     return a;
  364. }
  365.  
  366. int* getRandomArray(int length, int minValue, int maxValue)
  367. {
  368.     int* a = (int*) malloc(length * sizeof(int));
  369.     srand(57);
  370.  
  371.     int i;
  372.     for (i = 0; i < length; ++i)
  373.     {
  374.         a[i] = minValue + rand() % (maxValue - minValue);
  375.     }
  376.     return a;
  377. }
  378.  
  379.  
  380. int* getCopy(int* a)
  381. {
  382.     int* b = (int*) malloc(arrLen * sizeof(int));
  383.     int i;
  384.     for (i = 0; i < arrLen; ++i)
  385.     {
  386.         b[i] = a[i];
  387.     }
  388.     return b;
  389. }
  390.  
  391. void getTime(int* a)
  392. {
  393.     clock_t start, end;
  394.     int* copyOfArray;
  395.  
  396.     printf("heapSort  ");
  397.     copyOfArray = getCopy(a);
  398.     start = clock();
  399.     heapSort(copyOfArray);
  400.     end = clock();
  401.     printf("%lf\n", (double) (end - start) / (double) CLOCKS_PER_SEC);
  402.     free(copyOfArray);
  403.  
  404.     printf("bubbleSort  ");
  405.     copyOfArray = getCopy(a);
  406.     start = clock();
  407.     bubble(copyOfArray);
  408.     end = clock();
  409.     printf("%.11lf\n", (double) (end - start) / (double) CLOCKS_PER_SEC);
  410.     free(copyOfArray);
  411.  
  412.     printf("quickSort  ");
  413.     copyOfArray = getCopy(a);
  414.     start = clock();
  415.     quickSort(copyOfArray, 0, arrLen - 1);
  416.     end = clock();
  417.     printf("%.11lf\n", (double) (end - start) / (double) CLOCKS_PER_SEC);
  418.     free(copyOfArray);
  419.  
  420.  
  421.     printf("shellSort  ");
  422.     copyOfArray = getCopy(a);
  423.     start = clock();
  424.     shellSort(copyOfArray);
  425.     end = clock();
  426.     printf("%.11lf\n", (double) (end - start) / (double) CLOCKS_PER_SEC);
  427.     free(copyOfArray);
  428.  
  429.     printf("mergeSort  ");
  430.     int** arr = (int**) malloc(2 * sizeof(int*));
  431.     arr[0] = getCopy(a);
  432.     arr[1] = (int*) malloc(arrLen * sizeof(int));
  433.  
  434.     start = clock();
  435.     mergeSort(arr, 0, arrLen);
  436.     end = clock();
  437.     printf("%.11lf\n", (double) (end - start) / (double) CLOCKS_PER_SEC);
  438.     free(arr[0]);
  439.     free(arr[1]);
  440.     free(arr);
  441.  
  442. }
  443.  
  444. void someTests(int length)
  445. {
  446.     int *a;
  447.     printf("\n sorted array \n");
  448.     a = getSortedArray(length);
  449.     getTime(a);
  450.     free(a);
  451.  
  452.     printf("\n reversed array \n");
  453.     a = getReversedArray(length);
  454.     getTime(a);
  455.     free(a);
  456.  
  457.     printf("\n random array \n");
  458.     a = getRandomArray(length, -length, length);
  459.     getTime(a);
  460.     free(a);
  461.  
  462.     printf("\n array with often repeated elements\n");
  463.     a = getRandomArray(length, -100, 100);
  464.     getTime(a);
  465.     free(a);
  466.  
  467. }
  468.  
  469. int main()
  470. {
  471.     printf("\nsize of array: %d\n", SIZE1);
  472.     arrLen = SIZE1;
  473.     someTests(SIZE1);
  474.  
  475.     printf("\nsize of array: %d\n", SIZE2);
  476.     arrLen = SIZE2;
  477.     someTests(SIZE2);
  478.  
  479.     printf("\nsize of array: %d\n", SIZE3);
  480.     arrLen = SIZE3;
  481.     someTests(SIZE3);
  482.  
  483.     return 0;
  484. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement