实现c语言程序设计算法完成下面的二路归并排序函数,实现对n个数进行从小到大的二路归并排序。
时间: 2023-06-29 19:08:00 浏览: 94
C语言二路归并排序算法
以下是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(int arr[], int n) {
if (n < 2) {
return;
}
int mid = n / 2;
int *left = (int*)malloc(mid * sizeof(int));
int *right = (int*)malloc((n - mid) * sizeof(int));
for (int i = 0; i < mid; i++) {
left[i] = arr[i];
}
for (int i = mid; i < n; i++) {
right[i - mid] = arr[i];
}
merge_sort(left, mid);
merge_sort(right, n - mid);
merge(arr, left, mid, right, n - mid);
free(left);
free(right);
}
int main() {
int arr[] = {5, 2, 8, 3, 1, 9, 4, 6, 7};
int n = sizeof(arr) / sizeof(arr[0]);
merge_sort(arr, n);
for (int i = 0; i < n; i++) {
printf("%d ", arr[i]);
}
printf("\n");
return 0;
}
```
在上面的代码中,`merge()`函数实现了将两个有序数组合并成一个有序数组的操作。`merge_sort()`函数则是利用递归的思想将原数组分成两部分,分别进行排序,最后再将两个有序数组合并。整个过程中需要申请额外的空间来存储左右两个部分的数组,所以在合并后需要及时释放这些空间,避免内存泄漏。至于如何判断是否需要递归,只需要判断数组的长度是否小于2即可。最后在`main()`函数中,可以测试一下这个二路归并排序函数的实现效果。
阅读全文