Advertisement
vinocastro

ME 6 ko na di gumagana

Jan 12th, 2021
83
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.67 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. {
  34.     int N = r-p+1;
  35.     int copy[N+1];
  36.     for (int i = 1; i<=N; i++)
  37.     {
  38.         copy[i] = A[i];
  39.     }
  40.  
  41.     int groups_no = ceil(N/5);
  42.     int medians[groups_no+1];
  43.     for(int i = 0;i < groups_no;i++)
  44.     {
  45.         if(i == groups_no-1) //last group
  46.         {  
  47.             insertion_sort(copy,(i*5)+1,N);
  48.             int group_length = N - ((i*5)+1) + 1;
  49.             int median_ind = (group_length+1)/2 - 1;
  50.             medians[i] = copy[(i*5)+1+median_ind];
  51.         }
  52.         else
  53.         {
  54.             insertion_sort(copy,(i*5)+1,(i*5)+5);
  55.             int group_length = ((i*5)+5) - ((i*5)+1) + 1;
  56.             int median_ind = (group_length+1)/2 - 1;
  57.             medians[i] = copy[(i*5)+1+median_ind];
  58.            
  59.         }
  60.        
  61.     }
  62.  
  63.     if(groups_no > 5)
  64.     {
  65.         return quick_select(medians,1,groups_no,(groups_no+1)/2);
  66.     }
  67.     else
  68.     {
  69.         return medians[(groups_no+1)/2];
  70.     }
  71.    
  72.  
  73. }
  74.  
  75. int partition(int A[], int p, int r){
  76.     int M = (r-p)+1;
  77.     int median = median_of_medians(A,p,r);
  78.     int ind;
  79.     for(int i = p;i<=r;i++)
  80.     {
  81.         if(A[i]== median)
  82.         {
  83.             ind = i;
  84.         }
  85.     }
  86.     swap(&A[ind],&A[r]);
  87.     int x = A[r];
  88.     int i = p-1;
  89.     for(int j = p;j<=(r-1);j++)
  90.     {
  91.         if(A[j] <= x)
  92.         {
  93.             i++;
  94.             swap(&A[i],&A[j]);
  95.         }
  96.     }
  97.     swap(&A[i+1],&A[r]);
  98.     return i+1;
  99. }
  100.  
  101. int quick_select(int A[], int p, int r, int rank){
  102.     if(p == r)
  103.     {
  104.         return A[p];
  105.     }
  106.     int q = partition(A,p,r);
  107.     int k = q-p+1;
  108.     if(rank == k)
  109.     {
  110.         return A[q];
  111.     }
  112.     else if (rank < k)
  113.     {
  114.         return quick_select(A,p,q-1,rank);
  115.     }
  116.     else
  117.     {
  118.         return quick_select(A,q+1,r,rank-k);
  119.     }
  120. }
  121.  
  122. int main(){
  123.     int T, M;
  124.     scanf("%d", &T);
  125.     while(T-- > 0){
  126.         scanf("%d", &M);
  127.         int arr[M+1];
  128.  
  129.         //read the elements of the input array
  130.         for(int i=1; i<=M; i++){
  131.             scanf("%d",&arr[i]);
  132.         }
  133.  
  134.         int median_index = ((M+1)/2);
  135.         printf("Median: %d\n", quick_select(arr, 1, M, median_index));
  136.     }
  137. }
  138.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement