Advertisement
techno-

Crear ascendente

Dec 6th, 2022
101
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 6.75 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, x, y, z;
  107.  
  108.     printf("ASCENDENTE\n");
  109.     printf("\tn\t\tt     \t(n)/n^0.9       \tt(n)/n^1.13    \tt(n)/n^1.4\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.         x = t / pow(i,0.9);
  135.         y = t / pow(i,1.13);
  136.         z = t / pow(i, 1.4);
  137.         printf("%12d%15.3f%15.6f%15.6f%15.6f\n", i, t, x, y, z);
  138.     }
  139. }
  140.  
  141. void imprimirDescendente(int vector[]){
  142.     int i,k;
  143.     double t,ta,tb,t1,t2,x, y, z;
  144.     printf("\nDESCENDENTE\n");
  145.     printf("\tn\t\tt     \t(n)/n^0.9       \tt(n)/n^1.18    \tt(n)/n^1.4\n");
  146.     for(i=500;i<=32000;i=i*2) {
  147.         descendente(vector, i);
  148.         ta=microsegundos();
  149.         ord_monticulo(vector,i);
  150.         tb=microsegundos();
  151.         t=tb-ta;
  152.         if(t<500){
  153.             ta=microsegundos();
  154.             for(k=0;k<1000;k++){
  155.                 descendente(vector,i);
  156.                 ord_monticulo(vector,i);
  157.             }
  158.             tb=microsegundos();
  159.             t1=tb-ta;
  160.             ta=microsegundos();
  161.             for(k=0;k<1000;k++){
  162.                 descendente(vector,i);
  163.             }
  164.             tb=microsegundos();
  165.             t2=tb-ta;
  166.             t=(t1-t2)/k;
  167.         }
  168.  
  169.         x = t / pow(i,0.9);
  170.         y = t / pow(i,1.18);
  171.         z = t / pow(i, 1.4);
  172.         printf("%12d%15.3f%15.6f%15.6f%15.6f\n", i, t, x, y, z);
  173.     }
  174. }
  175.  
  176. void imprimirAleatorio(int vector[]){
  177.     int i,k;
  178.     double t,ta,tb,t1,t2,x, y, z;
  179.     printf("\nALEATORIO\n");
  180.     printf("\tn\t\tt     \t(n)/n^0.9       \tt(n)/n^1.1    \tt(n)/n^1.4\n");
  181.     for(i=500;i<=32000;i=i*2) {
  182.         aleatorio(vector, i);
  183.         ta=microsegundos();
  184.         ord_monticulo(vector,i);
  185.         tb=microsegundos();
  186.         t=tb-ta;
  187.         if(t<500){
  188.             ta=microsegundos();
  189.             for(k=0;k<1000;k++){
  190.                 aleatorio(vector,i);
  191.                 ord_monticulo(vector,i);
  192.             }
  193.             tb=microsegundos();
  194.             t1=tb-ta;
  195.  
  196.             ta=microsegundos();
  197.             for(k=0;k<1000;k++){
  198.                 aleatorio(vector,i);
  199.             }
  200.             tb=microsegundos();
  201.             t2=tb-ta;
  202.             t=(t1-t2)/k;
  203.         }
  204.  
  205.         x = t / pow(i,0.9);
  206.         y = t / pow(i,1.1);
  207.         z = t / pow(i, 1.4);
  208.         printf("%12d%15.3f%15.6f%15.6f%15.6f\n", i, t, x, y, z);
  209.     }
  210. }
  211.  
  212. void imprimirAscendenteCrear(int vector[]){
  213.     int i,k;
  214.     double t,ta,tb,t1,t2,x, y, z;
  215.     monticulo *M = malloc(sizeof(monticulo));
  216.     printf("\nCREAR MONTICULO ASCENDENTE\n");
  217.     printf("\tn\t\tt     \t(n)/n^0.9       \tt(n)/n^1.1    \tt(n)/n^1.4\n");
  218.     for(i=500;i<=32000;i=i*2) {
  219.         ascendente(vector, i);
  220.         ta=microsegundos();
  221.         crear_monticulo(vector,i,M);
  222.         tb=microsegundos();
  223.         t=tb-ta;
  224.         if(t<500){
  225.             ta=microsegundos();
  226.             for(k=0;k<1000;k++){
  227.                 ascendente(vector,i);
  228.                 crear_monticulo(vector,i,M);
  229.             }
  230.             tb=microsegundos();
  231.             t1=tb-ta;
  232.  
  233.             ta=microsegundos();
  234.             for(k=0;k<1000;k++){
  235.                 ascendente(vector,i);
  236.             }
  237.             tb=microsegundos();
  238.             t2=tb-ta;
  239.             t=(t1-t2)/k;
  240.         }
  241.  
  242.         x = t / pow(i,0.9);
  243.         y = t / pow(i,1.1);
  244.         z = t / pow(i, 1.4);
  245.         printf("%12d%15.3f%15.6f%15.6f%15.6f\n", i, t, x, y, z);
  246.     }
  247.     free(M);
  248. }
  249.  
  250.  
  251. void test(){
  252.     int i;
  253.     int a[10] = {5,3,4,8,0,2,1,6,7,9};
  254.     int ultimo=10;
  255.     monticulo *M = malloc(sizeof(monticulo));
  256.  
  257.     crear_monticulo(a,ultimo,M);
  258.     printf("Vector inicial\n");
  259.     for(i=0;i<M->ultimo;i++){
  260.         printf("%d",a[i]);
  261.     }
  262.     printf("\nCrear monticulo\n");
  263.     for(i=0;i<M->ultimo;i++){
  264.         printf("%d",M->vector[i]);
  265.     }
  266.     printf("\nOrdenacion por monticulos\n");
  267.     ord_monticulo(a,ultimo);
  268.  
  269.     for(i=0;i<M->ultimo;i++){
  270.         printf("%d",a[i]);
  271.     }
  272.     free(M);
  273.     printf("\n");
  274. }
  275.  
  276. int main() {
  277.     int vector[32000];
  278.  
  279.     printf("TEST\n");
  280.     test();
  281.     printf("\n");
  282.  
  283.     imprimirAscendente(vector);
  284.     imprimirDescendente(vector);
  285.     imprimirAleatorio(vector);
  286.     imprimirAscendenteCrear(vector);
  287.  
  288.     return 0;
  289. }
  290.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement