/*********************************************************   TD d'Algorithmique IN202    
ENSTA   
    
  Mardi 7 Novembre 2000   
    
  Exercices 1,2,3,6 et 7 : Tri a bulle et Tri fusion   
      
                                        Guillaume Poupard  
*********************************************************/   
#include <stdio.h>  
#include <stdlib.h>   
#include <time.h>  
   
/* Tri a bulle  
   Complexite=somme pour i allant de P+1 a r de i-p   
             =n(n-1)/2  
   dans tous les cas (independant du tableau a trier)*/   
     
int Tri_Bulle(int *A, int p, int r)   
  
{   
  int i,j,t;  
  int c=0;   
    
  for(i=r;i>p;i--)   
    for(j=p+1;j<=i;j++)  
      {   
        c++;  
        if (A[j-1]>A[j])   
          {  
            t=A[j-1];   
            A[j-1]=A[j];  
            A[j]=t;   
          }  
      }   
  return c;  
}   
  
   
/* Tri fusion  
   Complexite de Fusionner=r-p+1   
   Complexite=n*log2(n)=n*k pour n=2^k*/  
   
int Fusionner(int *A, int p, int q, int r)  
   
{  
  int * B;   
  int i,j,k;  
  int c=0;   
    
  B=(int *)malloc((r+1)*sizeof(int));   
    
  for(i=p;i<=q;i++)   
    B[i]=A[i];  
  for(j=q+1;j<=r;j++)   
    B[r+q+1-j]=A[j];  
  i=p;   
  j=r;  
  for(k=p;k<=r;k++)   
    {  
      c++;   
      if (B[i]<B[j])  
        {   
          A[k]=B[i];  
          i=i+1;   
        }  
      else   
        {  
          A[k]=B[j];   
          j=j-1;  
        }   
    }  
  free(B);   
  return c;  
}   
  
  
int Tri_Fusion(int *A, int p, int r)  
   
{  
  int q;   
    
  if (p<r)   
    {  
      int n1,n2,n3;   
        
      q=(p+r)/2;   
      n1=Tri_Fusion(A,p,q);  
      n2=Tri_Fusion(A,q+1,r);   
      n3=Fusionner(A,p,q,r);  
      return n1+n2+n3;   
    }  
  return 0;   
}  
   
void printtab(int *A, int p, int r)  
{   
  int i; 
  for(i=p;i<=r;i++)  
    printf("%d ",A[i]); 
  printf("\n");  
} 
  
void inittab(int *A, int p, int r) 
{  
  int i; 
  for(i=p;i<=r;i++)  
    A[i]=lrand48() % 100; 
}  
 
int main(int argc, char * argv[])  
{ 
  int n=atoi(argv[1]);  
  int *A; 
  time_t seed;  
  int c; 
  
  A=(int *)malloc(n*sizeof(int)); 
  
  time(&seed); 
  srand48(seed);  
 
  printf("Tri a bulle:\n");  
  inittab(A,0,n-1); 
  printtab(A,0,n-1);  
  c=Tri_Bulle(A,0,n-1); 
  printtab(A,0,n-1);  
  printf("Complexite=%d\n",c); 
  
  printf("\nTri fusion:\n"); 
  inittab(A,0,n-1);  
  printtab(A,0,n-1); 
  c=Tri_Fusion(A,0,n-1);  
  printtab(A,0,n-1); 
  printf("Complexite=%d\n",c);  
 
  exit(0);  
}


syntax highlighted by Code2HTML, v. 0.9.1