algorithm
Tri rapide
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)
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])