Advertisement
juaniisuar

P6 Estructuras 1 (EJ 11 Y 12) (V2)

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