Advertisement
techno-

p4 calvoritmos

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