分治法实现合并排序算法:输入一串以英文字符逗号隔开的数字,按升序排列。c语言实现
时间: 2024-10-21 08:04:02 浏览: 44
分治法是一种常见的算法设计策略,它将一个大问题分解成若干个小问题,然后递归地解决这些小问题,最后再将结果合并起来得到原问题的解。合并排序就是利用了这个思想,特别是应用于列表或数组的排序。
对于输入一串以英文字符逗号(',') 隔开的数字并按升序排列,我们可以将其理解为一个字符串数组,每个元素由逗号分隔。下面是简单的C语言实现步骤:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// 合并两个已排序的子数组
void merge(char* arr[], int left, int mid, int right) {
int n1 = mid - left + 1;
int n2 = right - mid;
// 创建临时数组存储左右两个子数组
char temp[n1+n2+1];
for (int i=0; i<n1; i++) {
temp[i] = arr[left+i][0]; // 假设每个数字是一个字符
}
for (int j=0; j<n2; j++) {
temp[i++] = arr[mid+1+j][0];
}
// 合并回原数组
temp[n1+n2] = '\0'; // 添加空字符作为结束标志
int i = 0, k = left;
while (i < n1 && k <= right) {
if (temp[i] <= arr[k][0]) {
arr[k][0] = temp[i];
i++;
} else {
arr[k][0] = arr[mid+1][0]; // 保持中间值不变
k++;
}
}
}
// 分治排序函数
void mergeSort(char* 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); // 合并两个有序子数组
}
}
int main() {
char str[] = "5,1,9,3,7,2"; // 输入的字符串,包含逗号
char* arr[100]; // 假设最多有100个元素
// 分割字符串并存入数组
char* token = strtok(str, ",");
int i = 0;
while (token != NULL) {
arr[i++] = strdup(token);
token = strtok(NULL, ",");
}
// 调用合并排序
mergeSort(arr, 0, i - 1);
// 输出排序后的数组
for (int j = 0; j < i; j++) {
printf("%s,", arr[j]);
}
// 清理动态分配的内存
for (int k = 0; k < i; k++) {
free(arr[k]);
}
return 0;
}
```
上述代码首先分割输入字符串,创建一个字符数组。接着,通过`mergeSort`函数对数组进行分治排序,并在主函数中处理输出和内存管理。
阅读全文