Advertisement
juaniisuar

P6 Estructuras 1 (EJ 11 Y 12)

Jun 28th, 2017
350
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 1.71 KB | None | 0 0
  1. //QSORT
  2. //No es estable
  3.  
  4. #include <stdio.h>
  5. #include <stdlib.h>
  6.  
  7. #define S(a) (sizeof(a) / sizeof(a[0]))
  8. #define max(a,b) (a<b) ? b : a
  9. #define min(a,b) (a>b) ? b : a
  10.  
  11. typedef enum {ALEATORIO, ULTIMO, MEDIO, MEDIANA_PMU} pivotType;
  12.  
  13. void swap(int *a, int *b){
  14.     int aux = *a;
  15.     *a = *b;
  16.     *b = aux;
  17. }
  18.  
  19. int partition(int arr[], int l, int r, pivotType P){
  20.     int piv_index;
  21.     switch(P){
  22.         case ALEATORIO:
  23.             piv_index = rand()%(r-l+1) + l;
  24.             break;
  25.         case ULTIMO:
  26.             piv_index = r;
  27.             break;
  28.         case MEDIO:
  29.             piv_index = (l+r)/2;
  30.             break;
  31.         case MEDIANA_PMU:
  32.             piv_index = arr[l] + arr[r] + arr[(l+r)/2] - max(arr[l], max(arr[r], arr[(l+r)/2])) - min(arr[l], min(arr[r], arr[(l+r)/2]));
  33.             piv_index = (piv_index == arr[l]) ? l : ((piv_index == arr[r]) ? r : (l+r)/2 );
  34.             break;
  35.         default:
  36.             piv_index = r;
  37.             break;
  38.     }
  39.  
  40.     swap(&arr[piv_index], &arr[r]);
  41.  
  42.     int i = l-1, j;
  43.     int pivot = arr[r];
  44.  
  45.     for(j = l; j<=r-1; j++)
  46.         if(arr[j] <= pivot)
  47.             swap(&arr[++i], &arr[j]);
  48.     swap(&arr[i+1], &arr[r]);
  49.     return i+1;
  50. }
  51.  
  52. void quicksort(int arr[], int l, int r, pivotType P){
  53.     if(l<r){
  54.         int p = partition(arr, l, r, P);
  55.         quicksort(arr, l, p-1, P);
  56.         quicksort(arr, p+1, r, P);
  57.     }
  58. }
  59.  
  60. int main()
  61. {
  62.     int k;
  63.     srand(time(NULL));
  64.     int a[] = {3,7,11,12,2,4,3,129,32,45,121,764,76,5,8};
  65.  
  66.     for(k=0; k<S(a); k++) printf("%d ", a[k]); puts("\n");
  67.  
  68.     quicksort(a, 0, S(a)-1, MEDIANA_PMU);
  69.  
  70.     for(k=0; k<S(a); k++) printf("%d ", a[k]); puts("\n");
  71.  
  72.     return 0;
  73. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement