Trier par shaker à cocktail

Tri au shaker à cocktail &#8211 ; le tri shaker, une variante du tri bidirectionnel à bulles.
L’algorithme fonctionne comme suit :

  1. La direction initiale de la recherche dans la boucle est sélectionnée (généralement de gauche à droite)
  2. Ensuite dans la boucle, les nombres sont vérifiés par paires
  3. Si l’élément suivant est plus grand, alors ils sont échangés
  4. Une fois terminé, le processus de recherche recommence avec le sens inversé
  5. La recherche est répétée jusqu’à ce qu’il n’y ait plus de permutations

La complexité temporelle de l’algorithme est similaire à celle d’une bulle ; O(n2).

Exemple d’implémentation en PHP :

<?php

function cocktailShakeSort($numbers)
{
    echo implode(",", $numbers),"\n";
    $direction = false;
    $sorted = false;
    do {
        $direction = !$direction;        
        $firstIndex = $direction == true ? 0 : count($numbers) - 1;
        $lastIndex = $direction == true ? count($numbers) - 1 : 0;
        
        $sorted = true;
        for (
            $i = $firstIndex;
            $direction == true ? $i < $lastIndex : $i > $lastIndex;
            $direction == true ? $i++ : $i--
        ) {
            $lhsIndex = $direction ? $i : $i - 1;
            $rhsIndex = $direction ? $i + 1 : $i;

            $lhs = $numbers[$lhsIndex];
            $rhs = $numbers[$rhsIndex];

            if ($lhs > $rhs) {
                $numbers[$lhsIndex] = $rhs;
                $numbers[$rhsIndex] = $lhs;
                $sorted = false;
            }
        }
    } while ($sorted == false);

    echo implode(",", $numbers);
}

$numbers = [2, 1, 4, 3, 69, 35, 55, 7, 7, 2, 6, 203, 9];
cocktailShakeSort($numbers);

?>

Ссылки

https://gitlab.com/demensdeum/algorithms/-/blob/master/sortAlgorithms/cocktailShakerSort/cocktailShakerSort.php

Источники

https://www.youtube.com/watch?v=njClLBoEbfI
https://www.geeksforgeeks.org/cocktail-sort/
https://rosettacode.org/wiki/Sorting_algorithms/Cocktail_sort

Leave a Comment

Your email address will not be published. Required fields are marked *