使用c语言二路归并排序,完成对数组23,32,27,18,45,11,63,12,19,16,25,52,14降序归并排序的代码
时间: 2024-10-10 15:10:25 浏览: 25
当然可以。在C语言中,我们可以使用递归的方式来实现二路归并排序算法。这里是一个简单的示例,它首先将数组分为两个部分,然后分别对它们进行排序,最后合并这两个已排序的部分。对于降序排列,我们在合并过程中会优先选择较大的元素。
```c
#include <stdio.h>
#include <stdlib.h>
// 归并函数,用于合并两个已排序的子数组
void merge(int arr[], int left[], int left_size, int right[], int right_size) {
int i = 0, j = 0, k = 0;
while (i < left_size && j < right_size) {
if (left[i] > right[j]) {
arr[k++] = left[i++];
} else {
arr[k++] = right[j++];
}
}
// 将剩余未加入的元素添加到结果数组中
while (i < left_size) {
arr[k++] = left[i++];
}
while (j < right_size) {
arr[k++] = right[j++];
}
}
// 二路归并排序函数
void merge_sort_descending(int arr[], int size) {
if (size <= 1)
return; // 如果只有一个元素或者为空,直接返回
int mid = size / 2;
int *left = (int*)malloc(mid * sizeof(int));
int *right = (int*)malloc((size - mid) * sizeof(int));
// 分割数组
for (int i = 0; i < mid; i++) {
left[i] = arr[i];
}
for (int i = mid; i < size; i++) {
right[i - mid] = arr[i];
}
// 对左右两部分分别进行排序
merge_sort_descending(left, mid);
merge_sort_descending(right, size - mid);
// 合并排序后的数组
merge(arr, left, mid, right, size - mid);
free(left);
free(right);
}
int main() {
int arr[] = {23, 32, 27, 18, 45, 11, 63, 12, 19, 16, 25, 52, 14};
int n = sizeof(arr) / sizeof(arr[0]);
printf("Original array:\n");
for (int i = 0; i < n; i++) {
printf("%d ", arr[i]);
}
merge_sort_descending(arr, n);
printf("\nSorted in descending order:\n");
for (int i = 0; i < n; i++) {
printf("%d ", arr[i]);
}
return 0;
}
```
当你运行这个程序,你会看到原始数组按升序排列,然后是经过二路归并排序后按降序排列的结果。
阅读全文