c语言用分治法实现二路归并排序 编写void merge(int a[],int low, int mid, int high)函数 编写void mergeSort(int a[],int low, int high)函数 手动输入数组
时间: 2024-12-14 19:19:26 浏览: 31
在C语言中,利用分治策略实现二路归并排序的过程可以分为两个步骤:合并和分割。
首先,我们编写`merge`函数,它负责将两个已排序的子数组合并成一个有序的整体。这个函数接受四个参数:待处理数组`a`、子数组的起始索引`low`、中间索引`mid`以及结束索引`high`:
```c
void merge(int a[], int low, int mid, int high) {
int n1 = mid - low + 1; // 子数组一的元素个数
int n2 = high - mid; // 子数组二的元素个数
int left[n1], right[n2]; // 临时数组存储子数组
// 分别复制两个子数组到临时数组
for (int i = 0; i < n1; i++)
left[i] = a[low + i];
for (int j = 0; j < n2; j++)
right[j] = a[mid + 1 + j];
int i = 0, j = 0, k = low; // 合并指针
while (i < n1 && j < n2) {
if (left[i] <= right[j]) { // 比较并选择较小的元素
a[k++] = left[i++];
} else {
a[k++] = right[j++];
}
}
// 将剩余未比较的部分直接复制过来
while (i < n1)
a[k++] = left[i++];
while (j < n2)
a[k++] = right[j++];
}
```
接下来,我们编写主函数`mergeSort`,它采用递归的方式对整个数组进行划分和排序:
```c
void mergeSort(int a[], int low, int high) {
if (low < high) {
// 找到中间点,分割数组
int mid = low + (high - low) / 2;
// 递归地对左右两半部分进行排序
mergeSort(a, low, mid);
mergeSort(a, mid + 1, high);
// 合并两个已排序的子数组
merge(a, low, mid, high);
}
}
```
最后,为了从用户那里接收输入,你需要提供一个获取整数数组的函数或者循环让用户提供输入。例如:
```c
#include <stdio.h>
// 获取用户输入的整数数组
void inputArray(int arr[], int size) {
for (int i = 0; i < size; i++) {
scanf("%d", &arr[i]);
}
}
int main() {
int size;
printf("请输入数组长度:");
scanf("%d", &size);
int a[size];
inputArray(a, size);
printf("开始排序...\n");
mergeSort(a, 0, size - 1);
printf("排序后的数组: ");
for (int i = 0; i < size; i++) {
printf("%d ", a[i]);
}
return 0;
}
```
阅读全文