如何用C++实现归并排序算法的详细步骤和代码示例?
时间: 2024-10-20 18:08:03 浏览: 39
C++实现归并排序算法
归并排序是一种基于分治策略的排序算法,它将数组递归地分成两半,对每一半分别进行排序,然后合并这两个已排序的部分。以下是用C++实现归并排序的详细步骤和代码示例:
**步骤如下:**
1. **分割(Divide)**:将待排序数组递归地分为两个子数组,直到每个子数组只有一个元素。
2. **合并(Merge)**:比较两个子数组的第一个元素,选择较小的那个放入新的数组,然后移动指向下一个元素的指针,重复这个过程直到一个子数组完全遍历完毕,再将另一个子数组剩余部分复制到新数组。
3. **递归结束条件**:当所有元素都被合并到新数组中时,排序完成。
```cpp
#include <iostream>
using namespace std;
// 合并两个已经排好序的子数组
void merge(int arr[], int l, int m, int r) {
int n1 = m - l + 1;
int n2 = r - m;
// 创建临时数组存储合并后的结果
int L[n1], R[n2];
// 将左、右子数组复制到临时数组
for (int i = 0; i < n1; i++)
L[i] = arr[l + i];
for (int j = 0; j < n2; j++)
R[j] = arr[m + 1+ j];
// 比较并合并临时数组到原数组
int i = 0, j = 0, k = l;
while (i < n1 && j < n2) {
if (L[i] <= R[j]) {
arr[k] = L[i];
i++;
} else {
arr[k] = R[j];
j++;
}
k++;
}
// 处理剩余未合并的元素
while (i < n1) {
arr[k] = L[i];
i++;
k++;
}
while (j < n2) {
arr[k] = R[j];
j++;
k++;
}
}
// 归并排序函数
void mergeSort(int arr[], int l, int r) {
if (l < r) {
// 找出中间位置
int m = l+(r-l)/2;
// 对左右两边分别进行排序
mergeSort(arr, l, m);
mergeSort(arr, m+1, r);
// 合并左右两个已排序区间
merge(arr, l, m, r);
}
}
// 测试函数
int main() {
int arr[] = {12, 11, 13, 5, 6, 7};
int arr_size = sizeof(arr) / sizeof(arr[0]);
cout << "Original array: \n";
for (int i = 0; i < arr_size; i++)
cout << arr[i] << " ";
mergeSort(arr, 0, arr_size - 1);
cout << "\nSorted array: \n";
for (int i = 0; i < arr_size; i++)
cout << arr[i] << " ";
return 0;
}
```
阅读全文