Advertisement
Guest User

Projet SDA - tri par paquets

a guest
Dec 12th, 2018
68
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.90 KB | None | 0 0
  1. typedef struct Liste Liste;
  2. struct Liste {
  3. double valeur;
  4. Liste* next;
  5. Liste* last;
  6. };
  7.  
  8. Liste* inserer(Liste* l, double x) {
  9. Liste* tmp = malloc(sizeof(Liste));
  10. tmp->valeur = x;
  11. tmp->next = l;
  12. tmp->last = NULL;
  13. if (l != NULL) {
  14. l->last = tmp;
  15. }
  16. return tmp;
  17. }
  18. void tri_paquet (double T[], unsigned taille, unsigned nb_intervalle) {
  19. unsigned i, j;
  20. Liste* Taux[nb_intervalle];
  21. for (i=0; i<nb_intervalle; i++) {
  22. Taux[i] = malloc(sizeof(Liste));
  23. Taux[i] = NULL;
  24. }
  25. double inter = 1.0/(double)nb_intervalle;
  26. double valeur;
  27. // Affectation des valeurs de T[i] dans les sous intervalles Taux.
  28. for (i=0; i<taille; i++)
  29. for (j=0; j<nb_intervalle; j++)
  30. if ((T[i] >= j*inter) && (T[i] < (j+1.0)*inter))
  31. Taux[j]=inserer(Taux[j],T[i]);
  32.  
  33. // Tri par insertion des sous intervalles Taux.
  34. for (i=0; i<nb_intervalle; i++) {
  35. Liste* tmpliste = Taux[i];
  36. if (tmpliste != NULL) {
  37. unsigned nb_trie = 1;
  38. Liste* tmpliste2;
  39. Liste* debutliste = Taux[i];
  40. unsigned compteur=1;
  41. // On compte le nombre d'élément du sous intervalle i.
  42. while (tmpliste->next != NULL) {
  43. compteur++;
  44. tmpliste=tmpliste->next;
  45. }
  46. // On trie par insertion tant que tout les éléments ne sont pas triés.
  47. while (nb_trie < compteur) {
  48. tmpliste = debutliste;
  49. int bool = 0;
  50.  
  51. for (j=0;j<nb_trie;j++)
  52. tmpliste = tmpliste->next;
  53.  
  54. valeur = tmpliste->valeur;
  55. tmpliste2 = tmpliste->last;
  56. if (valeur < tmpliste2->valeur) {
  57. while (valeur < tmpliste2->valeur) {
  58. if (tmpliste2->last != NULL)
  59. tmpliste2=tmpliste2->last;
  60. else {
  61. bool = 1;
  62. debutliste = tmpliste;
  63. break;
  64. }
  65. }
  66. // On actualise le précédent et le suivant de l'élément.
  67. tmpliste->last->next = tmpliste->next;
  68. if (tmpliste->next != NULL)
  69. tmpliste->next->last = tmpliste->last;
  70.  
  71. // Si l'élément devient le plus petit de la liste.
  72. if (bool == 1) {
  73. tmpliste->last = NULL;
  74. tmpliste->next = tmpliste2;
  75. tmpliste2->last = tmpliste;
  76. }
  77. // Si l'élément n'est pas le plus petit de la liste.
  78. else {
  79. tmpliste2->next->last = tmpliste;
  80. tmpliste->next = tmpliste2->next;
  81.  
  82. tmpliste->last = tmpliste2;
  83. tmpliste2->next = tmpliste;
  84. }
  85. }
  86. nb_trie++;
  87. }
  88. Taux[i]=debutliste;
  89. }
  90. }
  91.  
  92. // Concaténation des sous intervalles Taux dans Taux[0]
  93. Liste* debut;
  94. Liste* Tauxtri;
  95. for (i=0;i<nb_intervalle;i++) {
  96. if (Taux[i] != NULL) {
  97. debut = Taux[i];
  98. break;
  99. }
  100. }
  101. Tauxtri = debut;
  102. for (i=1; i<nb_intervalle ;i++) {
  103. while (Tauxtri->next != NULL) {
  104. Tauxtri = Tauxtri->next;
  105. }
  106. if (Taux[i] != NULL)
  107. Tauxtri->next = Taux[i];
  108. }
  109. // Affectation des valeurs triés dans le tableaux.
  110. Tauxtri = debut;
  111. for (i=0; i<taille; i++) {
  112. T[i] = Tauxtri->valeur;
  113. Tauxtri = Tauxtri->next;
  114. }
  115. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement