Sök…


Anmärkningar

Ibland är Quicksort också känd som Partition-Exchange sort.
Hjälprum: O(n)
Tidskomplexitet: värsta O(n²) , bästa O(nlogn)

Grunderna i Quicksort

Quicksort är en sorteringsalgoritm som väljer ett element ("pivot") och ordnar om arrayen som bildar två partitioner så att alla element mindre än pivot kommer före det och alla element större kommer efter. Algoritmen appliceras sedan rekursivt på partitionerna tills listan är sorterad.

1. Lomuto-partitionsschema:

Detta schema väljer en pivot som typiskt är det sista elementet i matrisen. Algoritmen upprätthåller indexet för att sätta pivoten i variabel i och varje gång den hittar ett element som är mindre än eller lika med pivot, ökas detta index och det elementet placeras före 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

Snabbsorteringsmekanism:

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

Exempel på snabb sortering: Exempel på snabbsortering

2. Hoare-partitionsschema:

Den använder två index som börjar i ändarna av arrayen som är uppdelad och sedan rör sig mot varandra tills de upptäcker en inversion: ett par element, ett större eller lika mycket som pivot, ett mindre eller lika, som är fel ordning relativt varandra. De inverterade elementen byts sedan ut. När indexen möts stannar algoritmen och returnerar det slutliga indexet. Hoares schema är mer effektivt än Lomutos partitionsschema eftersom det gör i genomsnitt tre gånger färre swappar och det skapar effektiva partitioner även om alla värden är lika.

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

Partition:

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]

C # Implementering

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;
    }
}

Haskell-implementering

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

Implementering av Lomuto-partitionsjava

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 i 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])

Skriver ut "[1, 1, 2, 3, 6, 8, 10]"



Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow