c++利用归并排序算法对以下数组进行排序。 (12,25,17,19,51,32,45,18,22,37,15)
时间: 2024-10-11 10:05:06 浏览: 28
C++排序算法之归并排序源码
5星 · 资源好评率100%
在C++中,我们可以使用归并排序(Merge Sort)算法来对给定的整数数组进行排序。归并排序是一种分治策略,它将数组分为两半,分别对每一半进行排序,然后合并两个已排序的部分。以下是基本步骤:
1. **分割**:首先,我们将数组一分为二,直到每个子数组只有一个元素。
```cpp
void mergeSort(int arr[], int left, int right) {
if (left < right) {
// 分割点
int mid = left + (right - left) / 2;
// 对左半部分进行排序
mergeSort(arr, left, mid);
// 对右半部分进行排序
mergeSort(arr, mid + 1, right);
// 合并两个已排序的部分
merge(arr, left, mid, right);
}
}
```
2. **合并**:当所有子数组都被排序后,我们将它们合并回原始数组。这是通过创建一个新的临时数组,并按照升序条件(如从小到大)将元素从左右两个子数组中逐个添加到临时数组中完成的。
```cpp
void merge(int arr[], int left, int mid, int right) {
int temp[right - left + 1]; // 临时数组
int i = left, j = mid + 1, k = 0;
// 将较小的元素依次添加到临时数组
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 (i = left; i <= right; i++) {
arr[i] = temp[i - left];
}
}
```
现在,你可以将给定的数组赋值给 `arr` 变量,并传递初始下标(0)和最后一个元素的索引(数组长度减1),调用 `mergeSort(arr, 0, array_size - 1)` 来完成排序。例如:
```cpp
int main() {
int arr[] = {12, 25, 17, 19, 51, 32, 45, 18, 22, 37, 15};
int n = sizeof(arr) / sizeof(arr[0]);
mergeSort(arr, 0, n - 1);
// 打印排序后的数组
for (int i = 0; i < n; i++) {
std::cout << arr[i] << " ";
}
return 0;
}
```
运行这个程序,你会得到一个按升序排列的数组。
阅读全文