利用归并排序算法对以下数组进行排序。 (12,25,17,19,51,32,45,18,22,37,15
时间: 2024-10-11 19:03:39 浏览: 35
Java程序员面试分类真题带解析.docx
5星 · 资源好评率100%
归并排序是一种分治策略的排序算法,它的基本思想是将一个大数组递归地分成两个小数组,然后对这两个小数组分别排序,最后合并它们得到有序的结果。对于给定的数组 (12, 25, 17, 19, 51, 32, 45, 18, 22, 37, 15),我们可以按照以下步骤进行归并排序:
1. **分割**:首先,我们将数组一分为二,直到每个子数组只有一个元素。
- 第一次分割后:(12), (25, 17, 19, 51, 32, 45, 18, 22, 37, 15)
- 再次分割:(12), (25), (17), (19), (51), (32), (45), (18), (22), (37), (15)
2. **合并**:然后逐层合并已排序的子数组,从最底层开始。
- 合并 (12) 和 (25): (12, 25)
- 合并 (12, 25) 和 (17): (12, 17, 25)
- ... 重复这个过程,直到所有子数组都被合并。
下面是归并排序的具体 C++ 实现:
```cpp
#include <iostream>
#include <vector>
// 归并排序函数
void merge(std::vector<int>& arr, int low, int mid, int high) {
// 创建临时数组
std::vector<int> temp(high - low + 1);
// 定义左指针和右指针
int i = low, j = mid + 1, k = 0;
// 将左右两部分依次放入临时数组
while (i <= mid && j <= high) {
if (arr[i] <= arr[j]) {
temp[k++] = arr[i++];
} else {
temp[k++] = arr[j++];
}
}
// 将剩余部分加入到临时数组
while (i <= mid) {
temp[k++] = arr[i++];
}
while (j <= high) {
temp[k++] = arr[j++];
}
// 将临时数组复制回原数组
for (int x = 0; x < k; x++) {
arr[low + x] = temp[x];
}
}
// 分而治之的主函数
void mergeSort(std::vector<int>& arr, int low, int high) {
if (low < high) {
int mid = low + (high - low) / 2;
mergeSort(arr, low, mid); // 对左侧数组进行排序
mergeSort(arr, mid + 1, high); // 对右侧数组进行排序
merge(arr, low, mid, high); // 合并排序后的数组
}
}
int main() {
std::vector<int> numbers = {12, 25, 17, 19, 51, 32, 45, 18, 22, 37, 15};
int array_size = numbers.size();
mergeSort(numbers, 0, array_size - 1);
// 输出排序后的数组
for (int i : numbers) {
std::cout << i << " ";
}
return 0;
}
```
运行这段代码后,你将看到数组 (12, 25, 17, 19, 51, 32, 45, 18, 22, 37, 15) 排序后的结果。
阅读全文