3-Way QuickSort(オランダ国旗)
ここではクイックソートの手法を見ていきますが、スリーウェイクイックソートを使用します。基本的なクイックソート手法は、ピボットとして要素を見つけ、ピボットの周りに配列を分割し、その後、ピボットの左右のサブ配列に対して繰り返します。
スリーウェイクイックソートも同様ですが、3つのセクションがあります。配列arr[1からn]は3つの部分に分かれています。
- arr [1 to i]
- arr [i + 1、j]
- arr [j + 1、n]
アルゴリズム
パーティション(arr、左、右、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
クイックソート(arr、左、右)-
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 or 0 elements
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
-
アレイローテーション用プログラムのCプログラム?
配列をn位置左に回転するCプログラムを作成します。 Cプログラミングで配列をn回左に回転させる方法。 Cプログラムで配列をn桁左に回転させるロジック。 Input: arr[]=1 2 3 4 5 6 7 8 9 10 N=3 Output: 4 5 6 7 8 9 10 1 2 3 説明 配列内の要素を読み取り、arrと言います。 Nなどの変数で回転する回数を読み取ります。 左指定された配列を1ずつN回回転させます。実際の左回転とは、配列要素を1つ左にシフトし、最初の要素を最後にコピーすることです。 例 #include <iostream> usin
-
クイックソート用のPythonプログラム
この記事では、以下に示す問題ステートメントの解決策について学習します。 問題の説明 −配列が与えられたので、クイックソートの概念を使用して配列を並べ替える必要があります ここでは、最初に配列をパーティション化し、別のパーティションを並べ替えて、並べ替えられた配列を取得します。 次に、以下の実装のソリューションを見てみましょう- 例 # divide function def partition(arr,low,high): i = ( low-1 ) pivot = arr[high] # pivot element &nb