C でのマージ ソート アルゴリズムの使用方法
マージ ソートは古典的な並べ替えアルゴリズムであり、分割統治法の考え方を使用して分割します。ソートされるシーケンス 2 つのサブシーケンスを別々にソートし、2 つの順序付きサブシーケンスを 1 つの順序付きシーケンスにマージします。以下では、C 言語を使用してマージ ソート アルゴリズムを実装する方法と具体的なコード例を紹介します。
マージ ソートの中心となるアイデアは、ソート対象のシーケンスを複数のサブシーケンスに分割し、サブシーケンスに対して再帰呼び出しソートを実行することです。最後にシーケンスを並べ替えると、サブシーケンスがマージされます。
具体的な手順は次のとおりです。
1) シーケンスの長さが 1 の場合は、順序付けされていることを意味し、直接返します。
2) シーケンスを 2 つのサブシーケンスに均等に分割し、次のようにします。並べ替え
3) 2 つの順序付きサブシーケンスを 1 つの順序付きシーケンスにマージします
以下はマージの実装です。 C 言語を使用したソート アルゴリズム コード例:
#include <iostream> #include <vector> using namespace std; // 合并两个有序子序列 void merge(vector<int>& arr, int left, int mid, int right) { int i = left; // 左子序列起始索引 int j = mid + 1; // 右子序列起始索引 int k = 0; // 临时数组起始索引 vector<int> temp(right - left + 1); // 临时数组 // 比较两个子序列的元素,将较小的元素放入临时数组中 while (i <= mid && j <= right) { if (arr[i] <= arr[j]) { temp[k++] = arr[i++]; } else { temp[k++] = arr[j++]; } } // 将剩余的元素复制到临时数组中 while (i <= mid) { temp[k++] = arr[i++]; } while (j <= right) { temp[k++] = arr[j++]; } // 将临时数组的元素复制回原数组 for (int m = 0; m < k; ++m) { arr[left + m] = temp[m]; } } // 归并排序递归函数 void mergeSort(vector<int>& arr, int left, int right) { if (left < right) { int mid = (left + right) / 2; // 递归调用排序 mergeSort(arr, left, mid); mergeSort(arr, mid + 1, right); // 合并两个有序子序列 merge(arr, left, mid, right); } } // 归并排序函数 void mergeSort(vector<int>& arr) { mergeSort(arr, 0, arr.size() - 1); } int main() { vector<int> arr = {4, 6, 2, 8, 9, 1, 5, 3, 7}; // 调用归并排序函数 mergeSort(arr); // 输出排序结果 for (int i = 0; i < arr.size(); ++i) { cout << arr[i] << " "; } cout << endl; return 0; }
上記のコードは、C を使用してマージ ソート アルゴリズムを実装する例です。まず、2 つの順序付けられたサブシーケンスをマージする merge
関数が定義されます。次に、mergeSort
関数が定義されます。この関数は、マージ ソートの再帰呼び出しを行うために使用されます。最後に、main
関数内でmergeSort
関数を呼び出し、ソート対象の配列をソートし、ソート結果を出力します。
マージ ソート アルゴリズムは、時間計算量が O(nlogn) の効率的で安定したソート アルゴリズムです。再帰呼び出しとマージ操作を通じて、マージ ソートは、並べ替えられるシーケンスを並べ替え用の小さなブロックに分割し、順序付けられたサブシーケンスを順序付けられたシーケンスにマージできます。 C 言語で実装された具体的なコード例を通じて、マージ ソート アルゴリズムの実装プロセスをより深く理解し、習得することができます。
以上がC++ でマージ ソート アルゴリズムを使用する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。