tabakowy

minmax.c

Mar 1st, 2017
37
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.96 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <pthread.h>
  4. #include <unistd.h>
  5.  
  6. int *input, *output, *flags, size, i;
  7.  
  8. int findMinIndex() {
  9.   int minIndex;
  10.  
  11.   // find next index excluding those used before
  12.   for (i = 0; i < size; i++) {
  13.     if (flags[i] != 1) {
  14.       minIndex = i;
  15.       break;
  16.     }
  17.   }
  18.  
  19.   // find next index with minimal value
  20.   for (i = 1; i < size; i++) {
  21.     if (flags[i] != 1) {
  22.       if (input[i] < input[minIndex]) {
  23.         minIndex = i;
  24.       }
  25.     }
  26.   }
  27.  
  28.   return minIndex;
  29. }
  30.  
  31. void sortByMin(int start, int stop) {
  32.   int minIndex;
  33.  
  34.   while (start <= stop) {
  35.     minIndex = findMinIndex();
  36.     output[start] = input[minIndex];
  37.     flags[minIndex] = 1;
  38.     start++;
  39.  
  40.   // display flags for debugging:
  41.   //   printf("\n# FLAGS:\t");
  42.   //   for (i = 0; i < size; i++)
  43.   //     printf("%d, ", flags[i]);
  44.   }
  45. }
  46.  
  47. int findMaxIndex() {
  48.   int maxIndex;
  49.  
  50.   for (i = 0; i < size; i++) {
  51.     if (flags[i] != 1) {
  52.       maxIndex = i;
  53.       break;
  54.     }
  55.   }
  56.  
  57.   for (i = 1; i < size; i++) {
  58.     if (flags[i] != 1) {
  59.       if (input[i] > input[maxIndex]) {
  60.         maxIndex = i;
  61.       }
  62.     }
  63.   }
  64.   return maxIndex;
  65. }
  66.  
  67. void sortByMax(int start, int stop) {
  68.   int maxIndex;
  69.  
  70.   while (stop >= start) {
  71.     maxIndex = findMaxIndex();
  72.     output[stop] = input[maxIndex];
  73.     flags[maxIndex] = 1;
  74.     stop--;
  75.  
  76.   // display flags for debugging:
  77.   //   printf("\n# FLAGS:\t");
  78.   //   for (i = 0; i < size; i++)
  79.   //     printf("%d, ", flags[i]);
  80.   }
  81. }
  82.  
  83. void *p() {
  84.   sortByMin(0, size/2);
  85. }
  86.  
  87. void *q() {
  88.   sortByMax(size/2+1, size-1);
  89. }
  90.  
  91. int main(int argc, char **argv) {
  92.   // default values if no args
  93.   if (argc <= 2) {
  94.     if (argc == 2) size = atoi(argv[1]);
  95.     else size = 25;
  96.     input = (int *)malloc(size * sizeof(int));
  97.     time_t tt;
  98.     int timestrap = time(&tt);
  99.     srand(timestrap);
  100.     for (i = 0; i < size; i++) {
  101.       input[i] = rand()%1000;
  102.     }
  103.   }
  104.  
  105.   // copy args to array
  106.   else {
  107.     size = argc - 1;
  108.     input = (int *)malloc(size * sizeof(int));
  109.     for (i = 0; i < size; i++) {
  110.       input[i] = atoi(argv[i+1]);
  111.     }
  112.   }
  113.  
  114.   // set flags
  115.   flags = (int *)malloc(size * sizeof(int));
  116.   for (i = 0; i < size; i++) {
  117.     flags[i] = 0;
  118.   }
  119.  
  120.   // create output array
  121.   output = (int *)malloc(size * sizeof(int));
  122.  
  123.   // sorting threads
  124.   pthread_t t1, t2;
  125.   pthread_create(&t1, 0, p, NULL);
  126.   pthread_create(&t2, 0, q, NULL);
  127.   pthread_join(t1, NULL);
  128.   pthread_join(t2, NULL);
  129.  
  130.   display results
  131.   printf("\nDisplay arrays? (y/n): ");
  132.   char display;
  133.   display = getchar();
  134.  
  135.   if (display == 'y') {
  136.     // display array before sorting
  137.     char *sep = "";
  138.     printf("# INPUT:\t");
  139.     for (i = 0; i < size; i++) {
  140.       printf("%s%d", sep, input[i]);
  141.       sep = ", ";
  142.     }
  143.  
  144.     sep = "";
  145.     printf("\n# OUTPUT:\t");
  146.     for (i = 0; i < size; i++) {
  147.       printf("%s%d", sep, output[i]);
  148.       sep = ", ";
  149.     }
  150.   }
  151.  
  152.   printf("\n");
  153.   return 0;
  154. }
Advertisement
Add Comment
Please, Sign In to add comment