1. クイックソート
クイックソートは、平均 O(n log n) 時間で実行できる比較ベースの並べ替えアルゴリズムであり、最も一般的に使用される高速で汎用的な並べ替えアルゴリズムの 1 つです。このアルゴリズムの基本的な考え方は、要素を「ピボット」 (通常は配列内の最初または最後の要素) として選択し、配列内の他のすべての要素をピボットと比較し、要素を以下にすることです。ピボットに部分配列を入れ、ピボットより大きい要素を別の部分配列に入れ、部分配列の要素が 0 または 1 つだけになるまでこの処理を各部分配列に再帰的に適用し、最後に部分配列を順番に連結すると、ソートされた配列が得られます。
具体的な手順は次のとおりです。
- ピボット要素 (通常は最初または最後の要素) を選択します。
- 配列を 2 つのサブ配列に分割し、ピボット要素に従って、ピボット要素以下の要素を左側のサブ配列に配置し、ピボット要素より大きい要素を右側のサブ配列に配置します。
- 左右の部分配列に対してクイックソート操作を再帰的に実行します。
- 最後に、左側、ピボット、右側の部分を接続して並べ替え結果を取得します。
このアルゴリズムのパフォーマンスは、選択したピボット要素に依存します。理想的には、配列の中央にある要素を毎回ピボットとして選択できます。このとき、クイック ソート アルゴリズムの時間計算量は o(n log n) です。 。ただし、選択したピボットが両端から遠く離れている場合、アルゴリズムの効率が低下する可能性があり、時間計算量は o(n^2) に達します。したがって、実際のアプリケーションでは、通常、アルゴリズムのパフォーマンスを向上させるためにいくつかの最適化戦略が採用されます。
以下は、C 言語で実装されたクイック ソート アルゴリズムです。
2. コードの実装
#include <stdio.h>
// 交换两个元素的值
void swap(int *a, int *b) {
int temp = *a;
*a = *b;
*b = temp;
}
// 分割函数,将数组分成左右两部分,并返回左右指针
int partition(int arr[], int low, int high) {
int pivot = arr[high]; // 选取最后一个元素作为基准值
int i = (low - 1); // i指向左边界
for (int j = low; j < high; j++) {
if (arr[j] <= pivot) {
i++;
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
int temp = arr[i + 1];
arr[i + 1] = arr[high];
arr[high] = temp;
return (i + 1); // 返回基准值的位置
}
// 快速排序函数
void quickSort(int arr[], int low, int high) {
if (low < high) {
int pivot = partition(arr, low, high); // 选取基准值
quickSort(arr, low, pivot - 1); // 对左边部分递归排序
quickSort(arr, pivot + 1, high); // 对右边部分递归排序
}
}
int main() {
int arr[] = {
5, 2, 8, 3, 9, 1, 6};
int n = sizeof(arr) / sizeof(arr[0]);
quickSort(arr, 0, n - 1);
printf("排序后的数组:\n");
for (int i = 0; i < n; i++) {
printf("%d ", arr[i]);
}
printf("\n");
return 0;
}
上記のコードでは、swap関数を使用して2つの要素の値を交換し、partition関数を使用して配列を左右の部分に分割し、左右のポインタを返します。そして、quickSort関数がメインです。クイックソートの関数。配列を再帰的にソートするために使用されます。main 関数では、整数配列を定義し、quickSort 関数を呼び出してそれを並べ替えます。最後に、ソートされた配列を出力します。
方法 2:
#include <stdio.h>
void quicksort(int *arr, int left, int right) {
if (left < right) {
int pivot = arr[right];
int i = left - 1;
int temp;
for (int j = left; j < right; j++) {
if (arr[j] <= pivot) {
i++;
temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
i++;
temp = arr[i];
arr[i] = pivot;
arr[right] = temp;
quicksort(arr, left, i-1);
quicksort(arr, i+1, right);
}
}
int main() {
int arr[] = {
4, 2, 1, 6, 3, 5};
int n = sizeof(arr)/sizeof(int);
quicksort(arr, 0, n-1);
printf("Sorted array: ");
for (int i = 0; i < n; i++) {
printf("%d ", arr[i]);
}
return 0;
}
クイック ソートの本体は、quicksort 関数です。この関数は、整数配列 arr、配列の左境界、配列の右境界の 3 つのパラメーターを受け入れます。次に、分割と並べ替えのために関数内で再帰が使用されます。
クイックソート機能では、まず左右のポインタが等しいかどうかを判定し、等しくない場合はソート処理に入ります。
ピボットとして選択された要素は arr[right] です。i および j ポインターの移動中、小さい要素は [left, i-1] の間隔に配置され、i は交換される次の位置を指します。最後にピボット要素を所定の位置に配置します。
最後に、タスクが処理されるまで、左と右の間隔を再帰的に並べ替えます。
クイックソート関数が実行されると、ソートされた結果が出力されます。