Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<stdio.h>
- #include<stdlib.h>
- /**************************************************************************************************************************************************/
- /**************************************************************************************************************************************************/
- /**************************************************************************************************************************************************/
- /**************************************************************************************************************************************************/
- /*LES TRIES PAR TABLEAU*/
- /*---------------------*/
- /**************************************************************************************************************
- /***************************************TRIE à BULLE*********************************************
- */
- // fonction echange qui echange deux variable x et y
- /*
- LES ENTREES : x ,y des pointeur de deux valeur
- LES SORTIES : les deux valeur x ,y echanger
- */
- void echanger(int *x ,int *y)
- {
- int p ;
- p =*x;
- *x = *y;
- *y = p;
- }//fin echange
- // la fonction qui trie avec la methode trie à bulle
- /*
- LES ENTREES : n :la taille du talbeau
- tab :Le tableau qui contient les valeur
- LES SORTIES: le tableau avec des valeur triees
- */
- void trie_a_bulle_tableau (int n,int tab[n])
- {
- int i1,i2;
- int a_permute = 1; //on l'initialise pour qu il puisse entrer dans la boucle
- for( i1 = 0 ; (i1<n-1) && (a_permute == 1);i1++)
- { //on intialise a_permute par FAUX
- a_permute = 0;
- for(i2=n-1;i2>=i1+1;i2--)
- {
- //on echange si l'element à i2 est inferieur à l'lement à i2 - 1
- if(tab[i2] <tab[i2-1]) {
- echanger(&tab[i2] ,&tab[i2 - 1]);
- a_permute = 1;//donc on a fait une permutation
- } //fin if
- }//fin for_i2
- }//fin for_i1
- }//fin trie_a_bulle
- /**************************************************************************************************************
- /***************************************TRIE PAR INSERTION********************************************
- */
- //la fonction qui trie avec la methode d'inseriton
- /*
- LES ENTREES : n :la taille du talbeau
- tab :Le tableau qui contient les valeur
- LES SORTIES: le tableau avec des valeur triees
- */
- void trie_par_insertion_tableau (int n,int tab[n])
- {
- int i1,i2;
- for( i1 = 1 ;i1<n;i1++)
- {
- i2 = i1;
- while ( tab[i2] <tab[i2-1] && i2>0 )
- {
- echanger(&tab[i2] ,&tab[i2 - 1]);
- i2--;//on decremente
- } //fin if
- }//fin for_i1
- }//fin trie_par_insertion
- /**************************************************************************************************************
- /***************************************TRIE PAR SELECTION*****************************************************
- */
- //la fonction qui trie avec la methode de la selection
- /*
- LES ENTREES : n :la taille du talbeau
- tab :Le tableau qui contient les valeur
- LES SORTIES: le tableau avec des valeur triees
- */
- void trie_par_selection_tableau (int n,int tab[n])
- {
- int i1,i2;
- int indice_pivot;
- for(i1 = 0 ; i1<n-1 ;i1++)
- {
- indice_pivot = i1; // on affect le nv indice
- for(i2 = i1+1 ; i2<n ;i2++)
- {
- if(tab[indice_pivot]>tab[i2]) //si l"element a indice_pivot est sup a l'elemnt a l indice i2
- indice_pivot = i2;
- }//fin for_i2
- if(i1!=indice_pivot) // si l'indice trouve est different de l'indice de debut
- echanger(&tab[indice_pivot],&tab[i1]); // on echange
- }//fin for_i1
- }//fin trie_par_selection_tableau
- /**************************************************************************************************************
- /*******************************************TRIE RAPIDE*************************************************
- */
- //calcul de la median entre les element x,y et z (l'element milieu)
- /*
- LES ENTREES : x,y,z des valeur
- LES SORTIES : la median des valeur deja entrees(x,y,z)
- */
- int median(int x,int y,int z)
- {
- if((x<y && y<z) || (z<y && y<x)) return y;
- if((y<x && x<z) || (z<x && x<y)) return x;
- return z;
- }//
- // la fonction qui decoupe une liste d'element en 2
- /*
- LES ENTREES : n :la taille du talbeau
- tab :Le tableau qui contient les valeur
- debut :ou on commence
- fin :la postion de la derniere valeur
- LES SORTIES: le tableau avec des valeur triees
- */
- int partition(int n,int tab[n],int debut,int fin)
- {
- int pivot = median( tab[debut], tab[fin] , tab[(fin-debut)/2]);
- int i = debut;
- int j = fin;
- while(1) // on repete tant que les element a l'interieur sont vrai
- {
- while(tab[i]<pivot && i<=fin){ i++;} // si l'element à i et inferieur a pivot donc on increment i
- while(tab[j]>pivot && j>=0){ j--;} // si l'element à j et superieur a pivot donc on decrement j
- if(i<j) {
- echanger(&tab[i],&tab[j]); // on echange (i) <-> (j)
- if(tab[i]== pivot) i++; // si (i) == pivot on incremente i
- if(tab[j]== pivot) j--; // si (j) == pivot on decrement j
- }//fin if
- else return j; // si i>=j on retourn j
- }
- }//fin partition
- //La fonction qui trie avec la methode Rapide
- /*
- LES ENTREES : n :la taille du talbeau
- tab :Le tableau qui contient les valeur
- debut :ou on a la premiers valeur
- fin :on on a la derniere valeur
- LES SORTIES: le tableau avec des valeur triees
- */
- void trie_rapide_tableau2(int n,int tab[n],int debut,int fin)
- {
- if(debut>=fin) return;
- int p = partition(n,tab,debut,fin); //on partionne notre tableau
- trie_rapide_tableau2(n,tab,debut,p-1); //on trie la partie a gauche
- trie_rapide_tableau2(n,tab,p+1,fin);//on trie la partie a droite
- }//fin trie_rapide_tableau2
- // fonction mere
- /*
- LES ENTREES : n :la taille du talbeau
- tab :Le tableau qui contient les valeur
- LES SORTIES: le tableau avec des valeur triees
- */
- void trie_rapide_tableau(int n ,int tab[n])
- {
- trie_rapide_tableau2(n,tab,0,n -1);
- }//fin trie_rapide_tableau
- /**************************************************************************************************************
- /*******************************************TRIE PAR EXTRACTION>>>>>>>>>(Methode de tournoi)*******************/
- //la fonction qui retoune le min avec la methode du tournoi
- int tournoi_tableau(int n,int tab,int fin)
- {
- int nombre_element =
- }
- //la fonction qui trie le tableau par la methode de tournoi
- void trie_par_extraction_tournoi_tableau(int n,int tab[n])
- {
- }//end trie_par_extraction_tournoi_tableau
- /**************************************************************************************************************
- /*******************************************TRIE PAR EXTRACTION>>>>>>>>>(Methode de heapsort)*******************/
- //la fonction descente cherche on descendant dans l'arbre le min
- /*
- LES ENTREES : n :la taille du tableau
- tab :le tableau contennant les valeur
- taille :ou on a le dernier element
- nd :le noeud actuel
- LES SORTIES : le minimum des fils
- */
- int descente_tableau(int n,int tab[n],int taille,int nd)
- {
- if((nd*2+1)>taille) return tab[nd]; // si le noeud n'a aucun fils
- if((nd*2+1)==taille) // si le noeud a un seul fils (fils gauche)
- {
- int fils_gauche = descente_tableau(n,tab,taille,nd*2+1);
- if( fils_gauche< tab[nd] ) // si le fils et plus petit que le noeud on echange
- echanger(&tab[nd],&tab[nd*2+1]) ;
- }
- else // si le noeud a les 2 fils
- {
- int fils_gauche = descente_tableau(n,tab,taille,nd*2+1);
- int fils_droite = descente_tableau(n,tab,taille,nd*2+2);
- if(fils_droite<=fils_gauche && fils_droite<tab[nd]) //si le fils droite est plus petit ou egal on echange
- echanger(&tab[nd],&tab[nd*2+2]);
- else if(fils_gauche<fils_droite && fils_gauche<tab[nd]) //sinon si le fils gauche et plus petit on echange
- echanger(&tab[nd],&tab[nd*2+1]);
- //sinon on ne fait rien
- }
- //on retourne la valeur du noeud
- return tab[nd];
- }//fin descente_tableau11
- //la fonction qui trie le tableau par la methode de tournoi
- /*
- LES ENTREES : n :La taille du tableau
- tab : le tableau qui contient les element
- LES SORTIES : le tableau tries
- */
- void trie_par_extraction_heapsort_tableau(int n,int tab[n])
- {
- int i ,j;
- for(i=n-1;i>=0;i--)
- {
- descente_tableau(n,tab,i,0);
- echanger(&tab[0],&tab[i]);
- }
- }//end trie_par_extraction_tournoi_tableau
- /**************************************************************************************************************************************************/
- /**************************************************************************************************************************************************/
- /**************************************************************************************************************************************************/
- /**************************************************************************************************************************************************/
- /*LES TRIES PAR POINTEUR*/
- /*---------------------*/
- /*LES STRUCTURES DE DEONNEES*/
- //LISTE
- typedef struct cel
- {
- int element;
- struct cel* suivant;
- }liste;
- // ARBRE
- typedef struct nd
- {
- struct nd* fg;
- struct nd* fd;
- int element;
- }arbre;
- //cette fonction trnasforme un tableau en une liste
- liste *tableau_en_liste(int n,int tab[n])
- {
- int i;
- liste *l = NULL;
- liste *p = NULL;
- for(i=0;i<n;i++)
- {
- if(i==0) //premiere iteration
- {
- p = l = (liste *)malloc(sizeof(liste));
- l->element = tab[i];
- l->suivant = NULL;
- continue;
- }//fin if
- l->suivant= (liste *)malloc(sizeof(liste));
- l->suivant->element = tab[i];
- l->suivant->suivant = NULL;
- l = l->suivant;
- }//fin for
- return p;
- }//fin tableau_en_liste
- //cette fonction tronsforme une liste en tableau
- int *liste_en_tableau(liste *l)
- {
- liste *p = l;
- int i =0;
- int *tab = (int *)malloc(sizeof(int));
- while(p)
- {
- if(i==0) //premier iteartion
- {
- tab = (int *)malloc(sizeof(int));
- *tab = p->element;
- }
- else
- {
- tab = (int *)realloc(tab,(i+1)*sizeof(int));
- *(tab+i) = p->element;
- }
- p = p->suivant;
- i++;
- }//fin while
- return tab;
- }//fin liste_en_tableau
- /****************************************************************************************/
- /************************************TRIE A BULLE***************************************/
- //la fonction qui trie la liste avec la methode de trie à bulle
- /*
- LES ENTEES : l pointeur de la liste
- LES SORTIEES : la liste trier
- */
- void trie_a_bulle_pointeur(liste *l)
- {
- liste *p = l,
- *ps = NULL;
- while(p) //tant qu il y a des element
- {
- ps = p->suivant;
- while(ps) //tant qu il y a un suivant
- {
- if(p->element > ps->element)
- echanger(&p->element,&ps->element);
- ps = ps->suivant;
- }//fin while ps
- p = p->suivant;
- }//fin while ^p
- }//fin trie_a_bulle_pointeur
- /*********************************************************************************************/
- /************************************TRIE PAR INSERTION***************************************/
- //la fonction qui trie avec la methode d'insertion
- /*
- LES ENTEES : l pointeur de la liste
- LES SORTIEES : la liste trier
- */
- void trie_par_insertion_pointeur(liste *l)
- {
- liste *p = l;
- liste *listeur ;
- while(p) //tant qu il y a des element
- {
- listeur = l;
- while(listeur!=p) //tant que listeur n est pas arrivé a lelement
- {
- if(listeur->element > p->element) //si listeur est superier a l'lement a p en echange
- echanger(&p->element,&listeur->element);
- listeur = listeur->suivant; //listeur suivant
- }//fin while ps
- p = p->suivant; //p suivant
- }//fin while p
- }//fin trie_par_insertion_pointeur
- /*********************************************************************************************/
- /************************************TRIE PAR SELECTION***************************************/
- //la fonction qui trie avec la methode de selection
- /*
- LES ENTEES : l pointeur de la liste
- LES SORTIEES : la liste trier
- */
- void trie_par_selection_pointeur(liste *l)
- {
- liste *p = l;
- liste *ps;
- liste *choisit;
- while(p)//tant que l'lement existe
- {
- ps = p->suivant;
- choisit = p;
- while(ps)//tant que suivant existe
- {
- if(choisit->element > ps->element) //qi choisit > ps
- choisit = ps;//on choisit le nouveau element
- ps = ps->suivant; // ps suivant
- }//fin while ps
- echanger(&p->element,&choisit->element); //echange p et choisit
- p = p->suivant; //p suivant
- }//fin while p
- }//fin trie_par_selection_pointeur
- /*********************************************************************************************/
- /************************************TRIE RAPIDE*********************************************/
- // la fonction qui partionne une liste et donne la liste gauche
- /*
- LES ENTREES : l : la liste principale
- LES SORTIES lg : la liste qui contiendra les element inferieur a pivot
- */
- liste *partition_liste_gauche(liste *l)
- {
- liste *p =l;
- liste *pivot = l;
- liste *ll;
- liste *lg =NULL ;
- while(p)
- {
- // if(p->element < pivot->element)
- if((p->element <= pivot->element) && (p!=pivot))
- {
- liste *ll = (liste *)malloc(sizeof(liste));
- ll->element = p->element;
- ll->suivant = lg;
- lg = ll;
- }//fin if
- p = p->suivant;
- }//fin while p
- return lg;
- }//fin partition_liste
- // la fonction qui partionne une liste et donne la liste droite
- /*
- LES ENTREES : l : la liste principale
- LES SORTIES
- ld : la liste qui contiendra les element inferieur a pivot
- */
- liste *partition_liste_droite(liste *l)
- {
- liste *p =l;
- liste *pivot = l;
- liste *ll;
- liste *ld =NULL ;
- while(p)
- {
- if(p->element > pivot->element)
- {
- liste *ll = (liste *)malloc(sizeof(liste));
- ll->element = p->element;
- ll->suivant = ld;
- ld = ll;
- }//fin if
- p = p->suivant;
- }//fin while p
- return ld;
- }//fin partition_liste
- //la fonction qui relie deux liste
- /*
- LES ENTREES : lg la liste a gauche
- ld la liste a droite
- LES SORTIES : une liste conbine lg->>ld
- */
- liste *relier(liste *lg,liste *pivot,liste *ld)
- {
- liste *p = lg;
- if(lg)
- {
- while(p->suivant)
- p = p->suivant;
- p->suivant = pivot;
- pivot->suivant = ld;
- return lg;
- }
- pivot->suivant = ld;
- return pivot;
- }//fin relier
- //la fonction qui trie une liste avec la methode quicksort
- /*
- LES ENTEES : l pointeur de la liste
- LES SORTIEES : la liste trier
- */
- liste *trie_rapide_pointeur(liste *l)
- {
- if(l==NULL) return l;
- if(l->suivant == NULL) return l;
- liste *lg = partition_liste_gauche(l);
- liste *ld = partition_liste_droite(l);
- lg =trie_rapide_pointeur(lg);
- ld =trie_rapide_pointeur(ld);
- l = relier(lg,l,ld);
- return l;
- }//fin trie_rapide_pointeur
- /*************************************************************************************************/
- /************************************TRIE EXTRACTION*********************************************/
- //CETTE fonction verifie une position donnees est ce qu il est dans l'arbre
- /*
- LES ENTREES : position :la position actuel
- position_rechercher : la position rechercher
- LES SORTIES : true (1) si la position est dans le ss arbre false(0) sinon
- */
- int dans_arbre(int position,int position_rechercher)
- {
- if(position_rechercher<position) return 0;
- if(position == position_rechercher) return 1;
- return dans_ss_arbre_gauche(position,position_rechercher) + dans_ss_arbre_droite(position,position_rechercher);
- }//fin dans_arbre
- //verifier si l'eemnt est dans le ss arbre gauche
- /*
- LES ENTREES : position :la position actuel
- position_rechercher : la position rechercher
- LES SORTIES : true (1) si la position est dans le ss arbre gauche false(0) sinon
- */
- int dans_ss_arbre_gauche(int position,int position_rechercher)
- {
- if(2*position == position_rechercher ) return 1;
- return dans_arbre(2*position,position_rechercher);
- }//fin dans_ss_arbre_gauche
- //verifier si l'element est dans le ss arbre droite
- /*
- LES ENTREES : position :la position actuel
- position_rechercher : la position rechercher
- LES SORTIES : true (1) si la position est dans le ss arbre doite false(0) sinon
- */
- int dans_ss_arbre_droite(int position,int position_rechercher)
- {
- if((2*position+1) == position_rechercher ) return 1;
- return dans_arbre(2*position+1,position_rechercher);
- }//fin dans_ss_arbre_gauche
- //insertion dans l'arbre avec la position donnee dans la liste
- /*
- LES ENTREES : a : notre arbre
- l : l'element qu on veut inserer
- pr : la position ou on veut inserer notre element
- posi : la position actuel
- LES SORTIES : notre arbre avec l'element qui est insere
- */
- arbre *inserer_arbre(arbre* a,liste *l,int pr,int posi)
- {
- if(pr==posi)
- {
- arbre *ap = (arbre *)malloc(sizeof(arbre));
- ap->element = l->element;
- ap->fd = ap->fg = NULL;
- return ap;
- }//fin p==1
- if(dans_ss_arbre_gauche(posi,pr))
- {
- a->fg = inserer_arbre(a->fg,l,pr,2*posi);
- }
- if(dans_ss_arbre_droite(posi,pr))
- {
- a->fd = inserer_arbre(a->fd,l,pr,2*posi+1);
- }
- return a;
- }
- //la foction qui construit l arbre a partir d une liste
- /*
- LES ENTREES : l : la liste qui contient les elements
- LES SORTIES : l'arbre construit avec les elements de la liste
- */
- arbre *liste_en_arbre(liste *l)
- {
- arbre *a = NULL;
- liste *p = l;
- int i=1;
- while(p)
- {
- a = inserer_arbre(a,p,i++,1);
- p = p->suivant;
- }//fin while
- return a;
- }//fin liste_en_arbre
- //la fonction descente organise l'arbre de tel sorte que le l'element au sommet doit etre supperier a ces fils
- /*
- LES ENTREES : a : l arbre qu on va descendre
- position : la position actuel
- fin : ou doit termine
- LES SORTIES : true (1) si la position est dans le ss arbre gauche false(0) sinon
- */
- arbre *descente_pointeur(arbre *a,int position,int fin)
- {
- //le cas si le noeud n'a aucun fils
- if((a->fd == NULL) && (a->fg == NULL)) return a;
- //le cas ou le noeud est le dernier element
- if(position==fin) return a;
- //si aucun de ses fils est en mesure de le traiter
- if((position*2)>fin) return a;
- //le cas ou le noeud n'a pas d'element droite
- //si on peut traiter le fils gauche
- if((position*2+1)>fin )
- {
- //si le fils gauche est apres le dernier element on doit pas le traiter
- // donc on le retourne
- if(position*2>fin) return a;
- //sinon on lui fait le mm traitemeent descente
- a->fg = descente_pointeur(a->fg,2*position,fin);
- //on test si le fils gauche est inferieur a l'element du noeud
- //si oui on l echange
- if((a->fg->element) < a->element)
- echanger(&(a->fg->element),&a->element);
- //apres le traitement on retourne
- return a;
- }
- //les deux fils existe
- //on traite le fils gauche
- a->fg = descente_pointeur(a->fg,2*position,fin);
- //on traite le fils droite
- a->fd = descente_pointeur(a->fd,2*position+1,fin);
- int vfg = a->fg->element;
- int vfd = a->fd->element;
- // on compare
- if(vfg<vfd)
- {
- if(vfg < a->element)
- echanger(&a->fg->element,&a->element);
- }
- else
- if(vfd < a->element) echanger(&a->fd->element,&a->element);
- //on retourne notre noeud
- return a;
- }// fin descente_pointeur
- //cette fonctient recupere un noeud a partir d une position donnes
- /*
- LES ENTREES : a : notre arbre
- position : la position qu on veut recuperer
- pa : la position actuel
- LES SORTIES : notre noeud
- */
- arbre *element_arbre(arbre *a,int position,int pa)
- {
- if(pa == position) return a;
- if(dans_ss_arbre_gauche(pa,position)) return element_arbre(a->fg,position,pa*2);
- if(dans_ss_arbre_droite(pa,position)) return element_arbre(a->fd,position,pa*2+1);
- }//fin element_arbre
- //la sous la fonction qui trie avec la methode d'extraction
- /*
- LES ENTREES :a : l'arbree a : traiter
- l : la liste des element
- position : la position actuel dans la liste
- sortie :notre arbre trier
- */
- arbre *trie_par_extraction_heapsort_pointeur_ss(arbre *a,liste *l,int position)
- {
- if(l==NULL) return a;
- a=trie_par_extraction_heapsort_pointeur_ss(a,l->suivant,position+1);
- a=descente_pointeur(a,1,position);
- echanger(&a->element,&element_arbre(a,position,1)->element);
- return a;
- }//fin trie_par_extraction_heapsort_tableau_sous
- //arbre en liste
- /*
- LES ENTREES : a :arbre
- l : la liste
- LES SORTIES : la liste
- */
- liste *arbre_en_liste(arbre *a,liste *l)
- {
- liste *p=l;
- liste *ln = NULL;
- int i=1;
- arbre *element;
- while(p)
- {
- element = element_arbre(a,i++,1);
- liste *pp =(liste *)malloc(sizeof(liste));
- pp->element = element->element;
- pp->suivant = ln;
- ln = pp;
- p = p->suivant;
- }
- return ln;
- }//fin arbre_en_liste
- //la la fonction qui trie avec la methode d'extraction
- /*
- LES ENTREES : l : la liste des element
- sortie :notre arbre trier sous forme d une liste
- */
- liste *trie_par_extraction_heapsort_pointeur(liste *l)
- {
- arbre *a=liste_en_arbre(l);
- a = trie_par_extraction_heapsort_pointeur_ss(a,l,1);
- return (liste *)arbre_en_liste(a,l);
- }//fin trie_par_extraction_heapsort_pointeur
- /************************************************************************************************************************************************/
- /************************************************************************************************************************************************/
- /************************************************************************************************************************************************/
- /************************************************************************************************************************************************/
- /************************************************************************************************************************************************/
- /******************************************************************* MAIN *********************************************************************/
- int main(int arg ,char** args)
- {
- int n=5;
- int i,tab[5] = {14,15,14,12,12};
- // liste *l = tableau_en_liste(n,tab);
- // l= trie_par_extraction_heapsort_pointeur(l);
- // int *tab1 = liste_en_tableau(l);
- trie_rapide_tableau(n,tab);
- for(i = 0 ;i<n;i++) printf("\t%d",tab[i]); printf("\n");
- system("PAUSE");
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement