Advertisement
techno-

p4 calvoritmos buscar cotas

Dec 4th, 2022
96
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 5.32 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <time.h>
  3. #include <stdlib.h>
  4. #include <sys/time.h>
  5. #include <math.h>
  6. #define TAM 512000
  7. typedef struct {
  8.     int vector[TAM];
  9.     int ultimo;
  10. } monticulo;
  11.  
  12. double microsegundos() {
  13.     struct timeval t;
  14.     if (gettimeofday(&t, NULL) < 0 )
  15.         return 0.0;
  16.     return (t.tv_usec + t.tv_sec * 1000000.0);
  17. }
  18.  
  19. void Hundir(monticulo *m, int i){
  20.     int aux;
  21.     int j;
  22.     int HijoIzq;
  23.     int HijoDer;
  24.     do {
  25.         HijoIzq=2*i+1;
  26.         HijoDer=2*i+2;
  27.         j=i;
  28.         if (HijoDer <= m->ultimo && m->vector[HijoDer] > m->vector[i]) {
  29.             i = HijoDer;
  30.         }
  31.         if (HijoIzq <= m->ultimo && m->vector[HijoIzq] > m->vector[i]) {
  32.             i = HijoIzq;
  33.         }
  34.         aux = m->vector[j];
  35.         m->vector[j] = m->vector[i];
  36.         m->vector[i] = aux;
  37.     }while(j!=i);
  38.  
  39. }
  40.  
  41. void ascendente(int v [], int n) {
  42.     int i;
  43.     for (i=0; i < n; i++)
  44.         v[i] = i;
  45. }
  46.  
  47. void descendente(int v [], int n){
  48.     int i;
  49.     int j;
  50.     for (i=0; i < n; i++) {
  51.         j = 10 - i;
  52.         v[i] = j;
  53.     }
  54. }
  55.  
  56. void aleatorio(int v [], int n) {/* se generan números pseudoaleatorio entre -n y +n */
  57.     int i, m=2*n+1;
  58.     for (i=0; i < n; i++)
  59.         v[i] = (rand() % m) - n;
  60. }
  61.  
  62.  
  63. void crear_monticulo(int a[], int n, monticulo *m){
  64.     int i;
  65.     int j;
  66.     m->ultimo=n;
  67.  
  68.     for(j=0;j<n;j++){
  69.         m->vector[j]=a[j];
  70.     }
  71.     for (i = n/2; i >= 0; i--) {
  72.       Hundir(m, i);
  73.     }
  74. }
  75.  
  76. int eliminar_mayor(monticulo *m){
  77.     int x;
  78.  
  79.     if(m==NULL){
  80.         printf("Error monticulo vacio\n");
  81.         exit(0);
  82.     }
  83.     x=m->vector[0];
  84.     m->vector[0]=m->vector[m->ultimo];
  85.     m->ultimo--;
  86.     if(m->ultimo>0) {
  87.         Hundir(m, 0);
  88.     }
  89.     return x;
  90. }
  91.  
  92. void ord_monticulo(int V[], int n){
  93.     int i;
  94.     monticulo *M = malloc(sizeof(monticulo));
  95.     crear_monticulo(V,n,M);
  96.  
  97.     for(i=M->ultimo-1;i>=0;i--){
  98.         V[i]= eliminar_mayor(M);
  99.     }
  100.  
  101.     free(M);
  102. }
  103.  
  104. void imprimirAscendente(int vector[]){
  105.     int i,k;
  106.     double t,ta,tb,t1,t2;
  107.  
  108.     printf("ASCENDENTE\n");
  109.     printf("n         t               f(n)     g(n)    h(n)\n");
  110.  
  111.     for(i=500;i<=32000;i=i*2) {
  112.         ascendente(vector, i);
  113.         ta=microsegundos();
  114.         ord_monticulo(vector,i);
  115.         tb=microsegundos();
  116.         t=tb-ta;
  117.         if(t<500){
  118.             ta=microsegundos();
  119.             for(k=0;k<1000;k++){
  120.                 ascendente(vector,i);
  121.                 ord_monticulo(vector,i);
  122.             }
  123.             tb=microsegundos();
  124.             t1=tb-ta;
  125.             ta=microsegundos();
  126.             for(k=0;k<1000;k++){
  127.                 ascendente(vector,i);
  128.             }
  129.             tb=microsegundos();
  130.             t2=tb-ta;
  131.             t=(t1-t2)/k;
  132.         }
  133.  
  134.         printf("%d      %f       f(n)     g(n)   h(n)\n",i,t);
  135.     }
  136. }
  137.  
  138. void imprimirDescendente(int vector[]){
  139.     int i,k;
  140.     double t,ta,tb,t1,t2;
  141.     printf("\nDESCENDENTE\n");
  142.     printf("n         t               f(n)     g(n)    h(n)\n");
  143.     for(i=500;i<=32000;i=i*2) {
  144.         descendente(vector, i);
  145.         ta=microsegundos();
  146.         ord_monticulo(vector,i);
  147.         tb=microsegundos();
  148.         t=tb-ta;
  149.         if(t<500){
  150.             ta=microsegundos();
  151.             for(k=0;k<1000;k++){
  152.                 descendente(vector,i);
  153.                 ord_monticulo(vector,i);
  154.             }
  155.             tb=microsegundos();
  156.             t1=tb-ta;
  157.             ta=microsegundos();
  158.             for(k=0;k<1000;k++){
  159.                 descendente(vector,i);
  160.             }
  161.             tb=microsegundos();
  162.             t2=tb-ta;
  163.             t=(t1-t2)/k;
  164.         }
  165.         printf("%d      %f       f(n)     g(n)   h(n)\n",i,t);
  166.     }
  167. }
  168.  
  169. void imprimirAleatorio(int vector[]){
  170.     int i,k;
  171.     double t,ta,tb,t1,t2;
  172.     printf("\nALEATORIO\n");
  173.     printf("n         t               f(n)     g(n)    h(n)\n");
  174.     for(i=500;i<=32000;i=i*2) {
  175.         aleatorio(vector, i);
  176.         ta=microsegundos();
  177.         ord_monticulo(vector,i);
  178.         tb=microsegundos();
  179.         t=tb-ta;
  180.         if(t<500){
  181.             ta=microsegundos();
  182.             for(k=0;k<1000;k++){
  183.                 aleatorio(vector,i);
  184.                 ord_monticulo(vector,i);
  185.             }
  186.             tb=microsegundos();
  187.             t1=tb-ta;
  188.  
  189.             ta=microsegundos();
  190.             for(k=0;k<1000;k++){
  191.                 aleatorio(vector,i);
  192.             }
  193.             tb=microsegundos();
  194.             t2=tb-ta;
  195.             t=(t1-t2)/k;
  196.         }
  197.         printf("%d      %f       f(n)     g(n)   h(n)\n",i,t);
  198.     }
  199. }
  200.  
  201.  
  202. void test(){
  203.     int i;
  204.     int a[10] = {5,3,4,8,0,2,1,6,7,9};
  205.     int ultimo=10;
  206.     monticulo *M = malloc(sizeof(monticulo));
  207.  
  208.     crear_monticulo(a,ultimo,M);
  209.     printf("Vector inicial\n");
  210.     for(i=0;i<M->ultimo;i++){
  211.         printf("%d",a[i]);
  212.     }
  213.     printf("\nCrear monticulo\n");
  214.     for(i=0;i<M->ultimo;i++){
  215.         printf("%d",M->vector[i]);
  216.     }
  217.     printf("\nOrdenacion por monticulos\n");
  218.     ord_monticulo(a,ultimo);
  219.  
  220.     for(i=0;i<M->ultimo;i++){
  221.         printf("%d",a[i]);
  222.     }
  223.     free(M);
  224.     printf("\n");
  225. }
  226.  
  227. int main() {
  228.     int vector[32000];
  229.  
  230.     printf("TEST\n");
  231.     test();
  232.     printf("\n");
  233.  
  234.     imprimirAscendente(vector);
  235.     imprimirDescendente(vector);
  236.     imprimirAleatorio(vector);
  237.  
  238.     return 0;
  239. }
  240.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement