Advertisement
rkynaa

quicksort.c (lab07)

Jan 23rd, 2018
131
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.77 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #define MAX_ELEMENT 99
  5.  
  6. void quicksort_rec(int array[], int start, int end, int pivot);
  7. int partition (int array[], int start, int end, int pivot);
  8. void swap(int *origin, int *end);
  9. int medOfThree(int array[], int random_1, int random_2, int random_3);
  10.  
  11. int main (int argc, char *argv[]) {
  12.     int entry_element = 0, counter, entry_size = 0;
  13.     int array[MAX_ELEMENT];
  14.     printf("Enter data size: ");
  15.     scanf("%d", &entry_size);
  16.     printf("Enter data: \n");
  17.     for (counter = 0; counter < entry_size; counter++) {
  18.         scanf("%d", &array[counter]);
  19.     }
  20.     if (!strcmp(argv[1], "-pn")) {
  21.         printf("Sorted with naive pivot:\n");
  22.         quicksort_rec(array, 0, entry_size - 1, array[0]);
  23.        
  24.     } else if (!strcmp(argv[1], "-pm")) {
  25.         printf("Sorted with median of three pivot:\n");
  26.         int random_1 = rand() % (entry_size - 1);
  27.         int random_2 = rand() % (entry_size - 1);
  28.         int random_3 = rand() % (entry_size - 1);
  29.         int median = medOfThree(array, random_1, random_2, random_3);
  30.         quicksort_rec(array, 0, entry_size - 1, median);
  31.    
  32.     } else if (!strcmp(argv[1], "-pr")) {
  33.         printf("Sorted with randomized pivot: \n");
  34.         int random = rand() % (entry_size - 1);
  35.         quicksort_rec(array, 0, entry_size - 1, array[random]);
  36.    
  37.     }
  38.     for (counter = 0; counter < entry_size; counter++) {
  39.         if (counter != entry_size - 1) {
  40.             printf("%d ", array[counter]);
  41.         } else {
  42.             printf("%d\n", array[counter]);
  43.         }
  44.     }
  45.     return EXIT_SUCCESS;
  46. }
  47.  
  48. void quicksort_rec(int array[], int start, int end, int pivot) {
  49.     if (start < end) {
  50.         int pivot_qs = partition(array, start, end, pivot);
  51.         quicksort_rec(array, start, pivot_qs - 1, pivot);
  52.         quicksort_rec(array, pivot_qs + 1, end, pivot);
  53.     }
  54. }
  55.  
  56. int partition (int array[], int start, int end, int pivot) {
  57.     int index_swap_1 = start - 1;
  58.     for (int index_swap_2 = start; index_swap_2 <= end - 1; index_swap_2++) {
  59.         if (array[index_swap_2] <= pivot) {
  60.             index_swap_1++;
  61.             swap(&array[index_swap_1], &array[index_swap_2]);
  62.         }
  63.     }
  64.     swap(&array[index_swap_1 + 1], &array[end]);
  65.     return index_swap_1 + 1;
  66. }
  67.  
  68. void swap(int *origin, int *end) {
  69.     int swap_var = *origin;
  70.     *origin = *end;
  71.     *end = swap_var;
  72. }
  73.  
  74. int medOfThree(int array[], int random_1, int random_2, int random_3) {
  75.     if (array[random_1] <= array[random_2] && array[random_1] >= array[random_3]) {
  76.         return array[random_1];
  77.     } else if (array[random_2] <= array[random_1] && array[random_2] >= array[random_3]) {
  78.         return array[random_2];
  79.     } else {
  80.         return array[random_3];
  81.     }
  82. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement