Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> การเขียนโปรแกรม C

3-Way QuickSort (Dutch National Flag) - การเรียง 3 ทิศทาง


ที่นี่เราจะดูเทคนิค QuickSort แบบ 3 ทิศทาง (Three-way QuickSort) QuickSort แบบปกติคือหา Pivot แล้ว Partition อาร์เรย์รอบ Pivot จากนั้น Recursive กับ Sub-array ด้านซ้ายและขวา

Three-way QuickSort คล้ายกันแต่แบ่งเป็น 3 ส่วน อาร์เรย์ arr[1 ถึง n] ถูกแบ่งเป็น 3 ส่วน:

  • arr[1 ถึง i]
  • arr[i+1 ถึง j]
  • arr[j+1 ถึง n]

อัลกอริทึม

partition(arr, left, right, i, j) -

begin
    if right – left <= 1, then
        if arr[right] < arr[left], then
            swap arr[right] and arr[left]
        i := left
        j := right
        return
    end if
    mid := left, pivot = arr[right]
    while mid <= right, do
        if arr[mid] < pivot, then
            swap arr[left], arr[mid]
            increase left and mid by 1
        else if arr[mid] = pivot, then increase mid by 1
        else
            swap arr[mid], arr[right]
            decrease right by 1
        done
    i := left – 1
    j := mid
end

quicksort(arr, left, right) -

begin
    if left >= right, then
        return
    end if
    define i and j
    partition(arr, left, right, i, j)
    quicksort(arr, left, i)
    quicksort(arr, j, right)
end

ตัวอย่าง

#include <iostream>
#include <vector>
using namespace std;
void partition(int arr[], int left, int right, int &i, int &j) {
    if (right - left <= 1) {
        if (arr[right] < arr[left])
            swap(arr[right], arr[left]);
        i = left;
        j = right;
        return;
    }
    int mid = left;
    int pivot = arr[right];
    while (mid <= right) {
        if (arr[mid] < pivot)
            swap(arr[left++], arr[mid++]);
        else if (arr[mid] == pivot)
            mid++;
        else if (arr[mid] > pivot)
            swap(arr[mid], arr[right--]);
    }
    i = left - 1;
    j = mid;
}
void quicksort(int arr[], int left, int right) {
    if (left >= right) // 1 หรือ 0 องค์ประกอบ
        return;
    int i, j;
    partition(arr, left, right, i, j);
    quicksort(arr, left, i);
    quicksort(arr, j, right);
}
void display(int arr[], int n) {
    for (int i = 0; i < n; ++i)
        cout << " " << arr[i];
    cout << endl;
}
int main() {
    int a[] = {4, 9, 4, 3, 1, 9, 4, 3, 9, 4, 3, 1, 4};
    int n = sizeof(a) / sizeof(int);
    display(a, n);
    quicksort(a, 0, n - 1);
    display(a, n);
}

ผลลัพธ์

4 9 4 3 1 9 4 3 9 4 3 1 4
1 1 3 3 3 4 4 4 4 4 9 9 9