Recherche…


Remarques

Parfois, Quicksort est également appelé tri par partition-échange.
Espace auxiliaire: O(n)
Complexité temporelle: pire O(n²) , meilleur O(nlogn)

Principes de base de Quicksort

Quicksort est un algorithme de tri qui sélectionne un élément ("le pivot") et réorganise le tableau en formant deux partitions de telle sorte que tous les éléments inférieurs au pivot le précèdent et que tous les éléments soient plus importants. L'algorithme est ensuite appliqué récursivement aux partitions jusqu'à ce que la liste soit triée.

1. Mécanisme de schéma de partition Lomuto:

Ce schéma choisit un pivot qui est généralement le dernier élément du tableau. L'algorithme maintient l'index pour placer le pivot dans la variable i et chaque fois qu'il trouve un élément inférieur ou égal à pivot, cet index est incrémenté et cet élément serait placé avant le pivot.

partition(A, low, high) is
pivot := A[high]
i := low
for j := low to high – 1 do
    if A[j] ≤ pivot then
        swap A[i] with A[j]
        i := i + 1
swap A[i] with A[high]
return i

Mécanisme de tri rapide:

quicksort(A, low, high) is
if low < high then
    p := partition(A, low, high)
    quicksort(A, low, p – 1)
    quicksort(A, p + 1, high)

Exemple de tri rapide: Exemple de tri rapide

2. Schéma de partition Hoare:

Il utilise deux indices qui commencent aux extrémités du tableau en cours de partitionnement, puis se déplacent l'un vers l'autre jusqu'à ce qu'ils détectent une inversion: une paire d'éléments, l'un plus grand ou égal au pivot, l'autre plus petit ou égal, qui est incorrect. ordre les uns par rapport aux autres. Les éléments inversés sont alors échangés. Lorsque les indices se rencontrent, l'algorithme s'arrête et renvoie l'index final. Le schéma de Hoare est plus efficace que le schéma de partition de Lomuto, car il effectue trois fois moins de swaps en moyenne et crée des partitions efficaces, même lorsque toutes les valeurs sont égales.

quicksort(A, lo, hi) is
if lo < hi then
    p := partition(A, lo, hi)
    quicksort(A, lo, p)
    quicksort(A, p + 1, hi)

Cloison :

partition(A, lo, hi) is
pivot := A[lo]
i := lo - 1
j := hi + 1
loop forever
    do:
        i := i + 1
    while A[i] < pivot do
    
    do:
        j := j - 1
    while A[j] > pivot do
    
    if i >= j then
        return j
    
    swap A[i] with A[j]

Implémentation C #

public class QuickSort
{
    private static int Partition(int[] input, int low, int high)
    {
        var pivot = input[high];
        var i = low - 1;
        for (var j = low; j <= high - 1; j++)
        {
            if (input[j] <= pivot)
            {
                i++;
                var temp = input[i];
                input[i] = input[j];
                input[j] = temp;
            }
        }
        var tmp = input[i + 1];
        input[i + 1] = input[high];
        input[high] = tmp;
        return (i + 1);
    }

    private static void SortQuick(int[] input, int low, int high)
    {
        while (true)
        {
            if (low < high)
            {
                var pi = Partition(input, low, high);
                SortQuick(input, low, pi - 1);
                low = pi + 1;
                continue;
            }
            break;
        }
    }

    public static int[] Main(int[] input)
    {
        SortQuick(input, 0, input.Length - 1);
        return input;
    }
}

Implantation Haskell

quickSort :: Ord a => [a] -> [a]
quickSort [] = []
quickSort (x:xs) = quickSort [ y | y <- xs, y <= x ] 
                   ++ [x] 
                   ++ quickSort [ z | z <- xs, z > x ]

Implémentation Java de la partition Lomuto

public class Solution {

public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);
    int n = sc.nextInt();
    int[] ar = new int[n];
    for(int i=0; i<n; i++)
      ar[i] = sc.nextInt();
     quickSort(ar, 0, ar.length-1);   
}

public static void quickSort(int[] ar, int low, int high)
 {
    if(low<high)
    {
        int p = partition(ar, low, high);
        quickSort(ar, 0 , p-1);
        quickSort(ar, p+1, high);
    }    
 }   
public static int partition(int[] ar, int l, int r)
 {
    int pivot = ar[r];
    int i =l;
    for(int j=l; j<r; j++)
     {
        if(ar[j] <= pivot)
         {
            int t = ar[j];
            ar[j] = ar[i];
            ar[i] = t;
            i++;
        }   
    } 
    int t = ar[i];
    ar[i] = ar[r];
    ar[r] = t;
 
    return i;
} 

Quicksort en Python

def quicksort(arr):
    if len(arr) <= 1:
        return arr
    pivot = arr[len(arr) / 2]
    left = [x for x in arr if x < pivot]
    middle = [x for x in arr if x == pivot]
    right = [x for x in arr if x > pivot]
    return quicksort(left) + middle + quicksort(right)

print quicksort([3,6,8,10,1,2,1])

Estampes "[1, 1, 2, 3, 6, 8, 10]"



Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow