サーチ…


備考

クイックソートは、「パーティション - Exchangeソート」とも呼ばれます。
補助空間: O(n)
時間の複雑さ:最悪のO(n²) 、最良のO(nlogn)

クイックソートの基礎

クイックソートは、要素(「ピボット」)をピックし、2つのパーティションを形成する配列を並べ替えるソートアルゴリズムで、ピボットよりも小さいすべての要素がその前に来て、すべての要素がより大きくなるように並べ替えます。アルゴリズムは、リストがソートされるまで、再帰的にパーティションに適用されます。

1. Lomutoパーティションスキームのメカニズム:

このスキームは、典型的にはアレイ内の最後の要素であるピボットを選択する。アルゴリズムはピボットを変数iに格納するようにインデックスを維持し、ピボット以下の要素を見つけるたびにこのインデックスをインクリメントし、ピボットの前にその要素を配置します。

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

クイックソートの仕組み:

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つのインデックスを使用します。ピボットより大きいか等しいピースの1つのペア、間違っているピース互いに相対的に反転された要素は次に交換されます。インデックスが一致すると、アルゴリズムは停止して最終インデックスを返します。 HoareのスキームはLomutoのパーティションスキームよりも効率的です。なぜなら、平均で3倍のスワップを行い、すべての値が等しい場合でも効率的なパーティションを作成するからです。

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

パーティション:

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#の実装

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

ハスケルの実装

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

LomutoパーティションのJava実装

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

PythonでQuicksort

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

"[1、1、2、3、6、8、10]"を印刷します。



Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow