Advertisement
techno-

P4 CALVORITMOS FINAL (BUSCAR COTAS SAMUEL RATA)

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