vinocastro

me 6 MEDIAN NI TIM

Jan 12th, 2021 (edited)
94
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.90 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <math.h>
  4.  
  5. void swap(int *a, int *b)
  6. {
  7.    int t;
  8.    t  = *b;
  9.    *b = *a;
  10.    *a = t;
  11. }
  12.  
  13. void insertion_sort(int A[], int from, int to) {
  14.     for(int i = from; i < to; i++) {
  15.         for(int j = i + 1; j > from && A[j] < A[j - 1]; j--) {
  16.             int temp = A[j - 1];
  17.             A[j - 1] = A[j];
  18.             A[j] = temp;
  19.         }
  20.     }
  21. }
  22.  
  23. int find_median(int A[],int p,int r)
  24. {
  25.     int n = r-p+1;
  26.     insertion_sort(A,p,r);
  27.     return A[n+1/2];
  28. }
  29.  
  30. int quick_select(int A[], int p, int r, int k);
  31.  
  32. int median_of_medians(int A[], int p, int r){
  33.     int N = r-p+1; // N of ORIGINAL array
  34.     int Copy[N+1]; // plus 1 cuz 1-indexed lol
  35.     for (int i=0; i<N; i++){
  36.         Copy[i] = A[i];
  37.     }
  38.    
  39.     int groups_no = ceil(N/5); // N of NEW subarray which will contain the median(s)
  40.     int Medians[groups_no+1]; // array which contains the median(s)
  41.     for (int i=p; i < groups_no+1; i++){
  42.         if (i < groups_no){ // FIRST NEW-1 GROUPS (guaranteed N 5 each)
  43.             insertion_sort(Copy, i*5-4, i*5); // minus cuz 1-indexed
  44.             Medians[i] = Copy[i*5-2]; // say i=2. then the median of the 2nd group is at index 8.
  45.         } else if (i == groups_no){ // LAST GROUP
  46.             int rem = N % 5;
  47.             if (rem == 0){
  48.                 insertion_sort(Copy, i*5-4, i*5);
  49.                 Medians[i] = Copy[i*5-2];
  50.             } else {
  51.                 insertion_sort(Copy, i*5-4, i*5-(5-rem));
  52.                 int med = (rem+1)/2;
  53.                 Medians[i] = Copy[i*5+med];
  54.             }
  55.         }
  56.     }
  57.     if (groups_no > 5){
  58.         return quick_select(Medians, 1, groups_no, (groups_no+1)/2);
  59.     } else {
  60.         int med = (groups_no+1)/2;
  61.         return Medians[med];
  62.     }
  63.  
  64. }
  65.  
  66. int partition(int A[], int p, int r){
  67.     int M = (r-p)+1;
  68.     int median = median_of_medians(A,p,r);
  69.     int ind;
  70.     for(int i = p;i<=r;i++)
  71.     {
  72.         if(A[i]== median)
  73.         {
  74.             ind = i;
  75.         }
  76.     }
  77.     swap(&A[ind],&A[r]);
  78.     int x = A[r];
  79.     int i = p-1;
  80.     for(int j = p;j<=(r-1);j++)
  81.     {
  82.         if(A[j] <= x)
  83.         {
  84.             i++;
  85.             swap(&A[i],&A[j]);
  86.         }
  87.     }
  88.     swap(&A[i+1],&A[r]);
  89.     return i+1;
  90. }
  91.  
  92. int quick_select(int A[], int p, int r, int rank){
  93.     if(p == r)
  94.     {
  95.         return A[p];
  96.     }
  97.     int q = partition(A,p,r);
  98.     int k = q-p+1;
  99.     if(rank == k)
  100.     {
  101.         return A[q];
  102.     }
  103.     else if (rank < k)
  104.     {
  105.         return quick_select(A,p,q-1,rank);
  106.     }
  107.     else
  108.     {
  109.         return quick_select(A,q+1,r,rank-k);
  110.     }
  111. }
  112.  
  113. int main(){
  114.     int T, M;
  115.     scanf("%d", &T);
  116.     while(T-- > 0){
  117.         scanf("%d", &M);
  118.         int arr[M+1];
  119.  
  120.         //read the elements of the input array
  121.         for(int i=1; i<=M; i++){
  122.             scanf("%d",&arr[i]);
  123.         }
  124.  
  125.         int median_index = ((M+1)/2);
  126.         printf("Median: %d\n", quick_select(arr, 1, M, median_index));
  127.     }
  128. }
  129.  
Add Comment
Please, Sign In to add comment