Advertisement
techno-

p2 (╯°□°)╯︵ ┻━┻

Oct 17th, 2022
44
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 5.08 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 10
  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 - izq + 1)) + 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[j];V[j]=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.     printf("Ordenacion rapida con inicializacion aleatoria\n");
  127.     aleatorio(a,tamano);
  128.     for(i=0;i<tamano;i++){
  129.         printf("%d ",a[i]);
  130.     }
  131.     printf("\n");
  132.     ord_rapida(a,tamano);
  133.     for(i=0;i<tamano;i++){
  134.         printf("%d ",a[i]);
  135.     }
  136.  
  137.     printf("\nOrdenacion rapida con inicializacion descendiente\n");
  138.     descendente(a,tamano);
  139.     for(i=0;i<tamano;i++){
  140.         printf("%d ",a[i]);
  141.     }
  142.     printf("\n");
  143.     ord_rapida(a,tamano);
  144.     for(i=0;i<tamano;i++){
  145.         printf("%d ",a[i]);
  146.     }
  147. }
  148.  
  149.  
  150.  
  151.  
  152. int main() {
  153.     test();
  154.     printf("\n");
  155.  
  156.     int k;
  157.     double ta,tb, t1, t2, t, x, y, z;
  158.     int n;
  159.  
  160.  
  161.     printf("           n           t(n)      t(n)/n^1.8      t(n)/n^2     t(n)/n^2.2\n");
  162.     for(n=500;n<=32000;n=n*2){
  163.         int a[n];
  164.         descendente(a,n);
  165.         ta=microsegundos();
  166.         ordenacionPorInsercion(a,n);
  167.         tb=microsegundos();
  168.  
  169.         t=tb-ta;
  170.         if(t<500){
  171.             ta=microsegundos();
  172.             for(k=0;k<100;k++){
  173.                 descendente(a,n);
  174.                 ordenacionPorInsercion(a,n);
  175.             }
  176.             tb=microsegundos();
  177.             t1=tb-ta;
  178.  
  179.             ta=microsegundos();
  180.             for(k=0;k<100;k++){
  181.                 descendente(a,n);
  182.             }
  183.             tb=microsegundos();
  184.             t2=tb-ta;
  185.             t=(t1-t2)/k;
  186.         }
  187.  
  188.         x = t / pow(n,1.8);
  189.         y = t / pow(n,2);
  190.         z = t / pow(n, 2.2);
  191.         printf("%12d%15.3f%15.6f%15.6f%15.6f\n", n, t, x, y, z);
  192.  
  193.     }
  194.  
  195.     printf("\n");
  196.     test2();
  197.     printf("\n");
  198.     printf("           n           t(n)      t(n)/n^1.8      t(n)/n^2     t(n)/n^2.2\n");
  199.     for(n=500;n<=32000;n=n*2){
  200.         int a[n];
  201.         descendente(a,n);
  202.         ta=microsegundos();
  203.         ord_rapida(a,n);
  204.         tb=microsegundos();
  205.  
  206.         t=tb-ta;
  207.         if(t<500){
  208.             ta=microsegundos();
  209.             for(k=0;k<100;k++){
  210.                 descendente(a,n);
  211.                 ord_rapida(a,n);
  212.             }
  213.             tb=microsegundos();
  214.             t1=tb-ta;
  215.  
  216.             ta=microsegundos();
  217.             for(k=0;k<100;k++){
  218.                 descendente(a,n);
  219.             }
  220.             tb=microsegundos();
  221.             t2=tb-ta;
  222.             t=(t1-t2)/k;
  223.         }
  224.  
  225.         x = t / pow(n,1.8);
  226.         y = t / pow(n,2);
  227.         z = t / pow(n, 2.2);
  228.         printf("%12d%15.3f%15.6f%15.6f%15.6f\n", n, t, x, y, z);
  229.  
  230.     }
  231.  
  232.  
  233.     return 0;
  234. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement