Advertisement
Ilshidur

Listes scala, tri et fusion (tri insertion et rapide)

Feb 25th, 2014
156
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Scala 2.41 KB | None | 0 0
  1. // ****** J'ai posté ceci pour les futurs élèves qui devront faire des algorithmes de ce genre en classe :D ******
  2. // ****** Comme ça, c'est EASY le Scala \o/ ******
  3.  
  4. // Tri par insertion (Scala) :
  5.  
  6. // Tri par insertion d'un élément :
  7. def insere(elem: Int, liste: List[Int]): List[Int] = {
  8.     liste match {
  9.         case Nil => elem::Nil // Transforme en liste
  10.         case head::tail =>
  11.         if ( elem < head ) {
  12.             elem::liste
  13.         } else {
  14.             head::insere(elem,tail)
  15.         }
  16.     }
  17. }
  18. // On utilise la dernière fonction pour trier une fonction (par insertion) :
  19. def tri(liste: List[Int]): List[Int] = {
  20.     liste match {
  21.         case Nil => liste
  22.         case head::tail => insere(head,tri(tail))
  23.     }
  24. }
  25. // Tri par insertion d'un élément avec le choix de l'ordre à mettre en condiion :
  26. // Exemple d'appel de la fonction :
  27. //      insere(0,List(1,2,3),(x,y)=>x<y)
  28. def insere(elem: Int, liste: List[Int], less: (Int,Int) => Boolean): List[Int] = {
  29.     liste match {
  30.         case Nil => elem::Nil
  31.         case head::tail =>
  32.         if ( less(elem,head) ) {
  33.             elem::liste
  34.         } else {
  35.             head::insere(elem,tail,less)
  36.         }
  37.     }
  38. }
  39. // Tri décroissant par insertion. On utilise la dernière fonction :
  40. def triDecroissant(liste: List[Int]): List[Int] = {
  41.     liste match {
  42.         case Nil => liste
  43.         case head::tail => insere(head,triDecroissant(tail),(x,y)=>x>y)
  44.     }
  45. }
  46.  
  47. // Fusion de listes triées (Scala) :
  48.  
  49. def fusion(list1: List[Int], list2: List[Int]): List[Int] = {
  50.     (list1,list2) match { // On regarde si list1 est vide :
  51.         case (Nil,list2) => list2 // On renvoie list2 si list1 est vide
  52.         case (list1,Nil) => list1 // Et on renvoie list1 si list2 est vide
  53.         case (head1::tail1,head2::tail2) => // Sinon :
  54.         if ( head1 < head2 ) { // Si la tête de list1 est inférieure à la tête de list2 :
  55.             head1::fusion(tail1,list2) // On renvoie la tête de list1 concaténée au reste des listes
  56.         } else {
  57.             head2::fusion(list1,tail2) // On renvoie la tête de list2 concaténée au reste des listes
  58.         }
  59.     }
  60. }
  61.  
  62. // Tri rapide (Scala) :
  63.  
  64. def sort(xs: Array[Int]) {
  65.     def swap(i: Int, j: Int) {
  66.         val t = xs(i); xs(i) = xs(j); xs(j) = t
  67.     }
  68.     def sort1(l: Int, r: Int) {
  69.         val pivot = xs((l + r) / 2)
  70.         var i = l; var j = r
  71.         while (i <= j) {
  72.             while (xs(i) < pivot)
  73.                 i += 1
  74.             while (xs(j) > pivot)
  75.                 j -= 1
  76.             if (i <= j) {
  77.                 swap(i, j)
  78.                 i += 1
  79.                 j -= 1
  80.             }
  81.         }
  82.         if (l < j)
  83.             sort1(l, j)
  84.         if (j < r)
  85.             sort1(i, r)
  86.     }
  87.     sort1(0, xs.length - 1)
  88. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement