Advertisement
techno-

p1

Oct 17th, 2022
44
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.94 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 UMBRAL 1
  7.  
  8. double microsegundos() {
  9.     struct timeval t;
  10.     if (gettimeofday(&t, NULL) < 0 )
  11.         return 0.0;
  12.     return (t.tv_usec + t.tv_sec * 1000000.0);
  13. }
  14.  
  15.  
  16. void ordenacionPorInsercion (int v[],int n) {
  17.     int i;
  18.     int j;
  19.     int x;
  20.  
  21.     for (i = 1; i <= n - 1; i++) {
  22.         x = v[i];
  23.         j = i - 1;
  24.         while (j > -1 && v[j] > x) {
  25.             v[j + 1] = v[j];
  26.             j = j - 1;
  27.         }
  28.         v[j + 1] = x;
  29.     }
  30. }
  31. void inicializar_semilla() {
  32.     srand(time(NULL));
  33. }
  34. void aleatorio(int v [], int n) {/* se generan números pseudoaleatorio entre -n y +n */
  35.     int i, m=2*n+1;
  36.     for (i=0; i < n; i++)
  37.         v[i] = (rand() % m) - n;
  38. }
  39. void ascendente(int v [], int n) {
  40.     int i;
  41.     for (i=0; i < n; i++)
  42.         v[i] = i;
  43. }
  44. void descendente(int v [], int n){
  45.     int i;
  46.     int j;
  47.     for (i=0; i < n; i++) {
  48.         j = 10 - i;
  49.         v[i] = j;
  50.     }
  51. }
  52.  
  53.  
  54.  
  55. void ordenarAux (int V[], int izq, int der) {
  56.     int i;
  57.     int j;
  58.     int x;
  59.     int Aux;
  60.     int pivote;
  61.     if (izq + UMBRAL <= der) {
  62.         x = (rand() % (der + 1 - izq)) + izq;
  63.         pivote=V[x];
  64.         Aux=V[izq]; V[izq]=V[x]; V[x]=Aux;
  65.         i=izq +1;
  66.         j= der;
  67.         while(i<=j){
  68.             while(i<= der && V[i] < pivote){
  69.                 i=i+1;
  70.             }
  71.             while(V[j]>pivote){
  72.                 j=j-1;
  73.             }
  74.  
  75.             if(i<j){
  76.                 Aux=V[i];V[i]=V[j];V[j]=Aux;
  77.                 i=i+1;
  78.                 j=j-1;
  79.             }
  80.         }
  81.         Aux=V[izq];V[izq]=V[der];V[der]=Aux;
  82.         ordenarAux(V,izq,j-1);
  83.         ordenarAux(V,j+1,der);
  84.     }
  85. }
  86. void ord_rapida(int v [], int n) {
  87.     ordenarAux(v, 0, n-1);
  88.     if (UMBRAL > 1)
  89.         ordenacionPorInsercion(v, n);
  90. }
  91.  
  92.  
  93. void test(){
  94.     inicializar_semilla();
  95.     int tamano=20;
  96.     int a[tamano];
  97.     int i;
  98.  
  99.     printf("Ordenacion por insercion con inicializacion aleatoria\n");
  100.     aleatorio(a,tamano);
  101.     for(i=0;i<tamano;i++){
  102.         printf("%d ",a[i]);
  103.     }
  104.     printf("\n");
  105.     ordenacionPorInsercion(a,tamano);
  106.     for(i=0;i<tamano;i++){
  107.         printf("%d ",a[i]);
  108.     }
  109.     printf("\nOrdenacion por insercion con inicializacion descendiente\n");
  110.     descendente(a,tamano);
  111.     for(i=0;i<tamano;i++){
  112.         printf("%d ",a[i]);
  113.     }
  114.     printf("\n");
  115.     ordenacionPorInsercion(a,tamano);
  116.     for(i=0;i<tamano;i++){
  117.         printf("%d ",a[i]);
  118.     }
  119. }
  120.  
  121. void test2(){
  122.     inicializar_semilla();
  123.     int tamano=20;
  124.     int a[tamano];
  125.     int i;
  126.     aleatorio(a,tamano);
  127.     for(i=0;i<tamano;i++){
  128.         printf("%d ",a[i]);
  129.     }
  130.     printf("\n");
  131.     ord_rapida(a,tamano);
  132.     for(i=0;i<tamano;i++){
  133.         printf("%d ",a[i]);
  134.     }
  135. }
  136.  
  137.  
  138.  
  139.  
  140. int main() {
  141.     test();
  142.     printf("\n");
  143.  
  144.     int k;
  145.     double ta,tb, t1, t2, t, x, y, z;
  146.     int n;
  147.  
  148.  
  149.     printf("           n           t(n)      t(n)/n^1.8      t(n)/n^2     t(n)/n^2.2\n");
  150.     for(n=500;n<=32000;n=n*2){
  151.         int a[n];
  152.         descendente(a,n);
  153.         ta=microsegundos();
  154.         ordenacionPorInsercion(a,n);
  155.         tb=microsegundos();
  156.  
  157.         t=tb-ta;
  158.         if(t<500){
  159.             ta=microsegundos();
  160.             for(k=0;k<100;k++){
  161.                 descendente(a,n);
  162.                 ordenacionPorInsercion(a,n);
  163.             }
  164.             tb=microsegundos();
  165.             t1=tb-ta;
  166.  
  167.             ta=microsegundos();
  168.             for(k=0;k<100;k++){
  169.                 descendente(a,n);
  170.             }
  171.             tb=microsegundos();
  172.             t2=tb-ta;
  173.             t=(t1-t2)/k;
  174.         }
  175.  
  176.         x = t / pow(n,1.8);
  177.         y = t / pow(n,2);
  178.         z = t / pow(n, 2.2);
  179.         printf("%12d%15.3f%15.6f%15.6f%15.6f\n", n, t, x, y, z);
  180.  
  181.     }
  182.     /*
  183.  
  184.     int k;
  185.     double t1, t2, t, x, y, z;
  186.     int cont;
  187.     int n;
  188.  
  189.     inicializar_semilla();
  190.     int tamano = 500;
  191.     int a[tamano];
  192.     aleatorio(a,tamano);
  193.     int izq;
  194.     int der;
  195.     izq = a[1];
  196.     der = a[500];
  197.  
  198.     t1 = microsegundos();
  199.     ordenarAux(a, izq, der);
  200.     t2 = microsegundos();
  201.  
  202.     t = t2 - t1;
  203.  
  204.     if (t < 500) {
  205.         t1 = microsegundos();
  206.         for (k = 0; k <= 100; k++) {
  207.             ordenarAux(a, izq, der);
  208.         }
  209.         t2 = microsegundos();
  210.         t = (t2 - t1) / k;
  211.     }
  212.  
  213.     for (cont = 1; cont <= 3; cont++) {
  214.         for (n = 500; n <= 32000; n = n * 2) {
  215.             inicializar_semilla();
  216.             int b[n];
  217.             aleatorio(b,n);
  218.             t1 = microsegundos();
  219.             ordenarAux(b, izq, der);
  220.             t2 = microsegundos();
  221.             t = t2 - t1;
  222.             x = t / pow(n,1.8);
  223.             y = t / pow(n,2);
  224.             z = t / pow(n, 2.2);
  225.             printf("%12d%15.3f%15.6f%15.6f%15.6f\n", n, t, x, y, z);
  226.         }
  227.         printf("\n");
  228.     }
  229. */
  230.  
  231.     printf("\nTEST2\n");
  232.     test2();
  233.     return 0;
  234. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement