用c语言实现分治法实现合并排序算法:输入一串以英文字符逗号隔开的数字,按升序排列。
时间: 2024-09-20 16:08:47 浏览: 51
在C语言中,合并排序是一种常见的分治算法,它将一个大数组分成两个较小的部分,分别对它们进行排序,然后合并这两个已排序的部分。以下是使用C语言实现合并排序处理字符串并按照升序排列的一个简化版本:
首先,我们需要创建一些辅助函数:
1. `char** split_string(const char* input, int* len)`:这个函数用于将输入字符串分割成单个整数,并返回一个指向字符串数组的指针。
2. `void merge(char** arr1, char** arr2, int left1, int mid, int right2)`:合并两个已经排好序的子数组。
3. `void merge_sort(char** arr, int left, int right)`:递归地对子数组进行合并排序。
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// 辅助函数:分割字符串
char** split_string(const char* input, int* len) {
*len = 0;
for (const char* c = input; *c != '\0'; ++c) {
if (*c == ',') {
(*len)++;
}
}
*len++; // 添加最后一个元素的位置
char** arr = (char**)malloc((*len + 1) * sizeof(char*));
arr[0] = (char*)malloc(strlen(input) + 1);
strcpy(arr[0], input);
int i = 1;
for (int j = 0; input[j]; j++) {
if (input[j] == ',') {
arr[i++] = (char*)malloc(sizeof(char));
arr[i - 1][strlen(arr[i - 1])] = '\0';
}
}
arr[i] = NULL;
return arr;
}
// 合并两个有序数组
void merge(char** arr1, char** arr2, int left1, int mid, int right2) {
int i = left1, j = mid, k = 0;
char* merged = (char*)malloc((right2 - left1 + 1) * sizeof(char));
while (i <= mid && j <= right2) {
if (strcmp(arr1[i], arr2[j]) < 0) {
merged[k++] = arr1[i++][0];
} else {
merged[k++] = arr2[j++];
}
}
// 将剩余的元素复制到结果数组
while (i <= mid) {
merged[k++] = arr1[i++][0];
}
while (j <= right2) {
merged[k++] = arr2[j++][0];
}
// 将合并后的数组赋值给原数组
for (int l = 0; l < k; l++) {
arr1[left1 + l] = merged + l;
}
free(merged);
}
// 分治排序
void merge_sort(char** arr, int left, int right) {
if (left < right) {
int mid = left + (right - left) / 2;
merge_sort(arr, left, mid);
merge_sort(arr, mid + 1, right);
merge(arr, arr, left, mid, right);
}
}
int main() {
const char* str = "5,3,8,6,1,9";
int str_len;
char** arr = split_string(str, &str_len);
// 对字符串数组进行排序
merge_sort(arr, 0, str_len - 1);
printf("Sorted string: ");
for (int i = 0; arr[i]; i++) {
printf("%s,", arr[i]);
}
printf("\n");
// 清理内存
for (int i = 0; arr[i]; i++) {
free(arr[i]);
}
free(arr);
return 0;
}
```
当你运行此程序时,会得到输入字符串"5,3,8,6,1,9"升序排列的结果,如:"1,3,5,6,8,9,"。
阅读全文