以c++的方式,采用自下而上的策略实现对数组【9,6,3,1,7】的递归排序
时间: 2023-06-07 22:08:31 浏览: 45
好的,针对您的问题,我可以给出下面的C语言代码供您参考:
```
#include <stdio.h>
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, k = 0; i <= right; i++, k++) {
arr[i] = temp[k];
}
}
void merge_sort(int arr[], int left, int right)
{
if (left < right) {
int mid = (left + right) / 2;
merge_sort(arr, left, mid); // 左边归并排序
merge_sort(arr, mid + 1, right); // 右边归并排序
merge(arr, left, mid, right); // 合并两个有序数组
}
}
int main(void)
{
int arr[] = {9, 6, 3, 1, 7};
int len = sizeof(arr) / sizeof(arr[0]);
printf("Before sorting: ");
for (int i = 0; i < len; i++) {
printf("%d ", arr[i]);
}
printf("\n");
merge_sort(arr, 0, len - 1);
printf("After sorting: ");
for (int i = 0; i < len; i++) {
printf("%d ", arr[i]);
}
printf("\n");
return 0;
}
```
该代码使用了归并排序算法,通过每次将数组一分为二进行递归排序,最后再将排序好的数组合并起来。使用自下而上的策略,首先将数组的每个元素看作一个有序的小数组,然后将相邻的两个小数组合并成一个更大的有序数组,一步步地合并下去,最终得到排序好的结果。