递归与分治法实现快速排序算法,输入一串以英文字符逗号隔开的数字,按升序排列法实现快速排序算法。用c语言完成
时间: 2024-10-20 09:04:09 浏览: 24
递归与分治法是一种高效的算法设计策略,特别适合于像快速排序这样的排序问题。快速排序的基本思想是选取一个“基准”元素,将数组分为两部分,一部分的所有元素都比基准小,另一部分都比基准大,然后对这两部分分别进行同样的操作,直到整个序列有序。
对于输入一串以英文字符逗号(,)隔开的数字,我们可以先解析成整数数组,然后利用快速排序的步骤进行处理。下面是一个简单的C语言实现:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// 分割函数,返回分割点
int partition(char *arr, int low, int high) {
char pivot = arr[high];
int i = (low - 1);
for (int j = low; j <= high - 1; j++) {
if (strcmp(arr[j], pivot) < 0) {
i++;
// 使用strncpy避免内存溢出,因为字符串复制可能超出原数组范围
strncpy(&arr[i+1], &arr[j+1], strlen(arr[j]) + 1);
}
}
// 将pivot放到正确的位置
strncpy(&arr[i+1], &arr[high], strlen(arr[high]) + 1);
return i + 1;
}
// 快速排序函数
void quickSort(char *arr, int low, int high) {
if (low < high) {
int pi = partition(arr, low, high);
quickSort(arr, low, pi - 1); // 对左半部分进行递归排序
quickSort(arr, pi + 1, high); // 对右半部分进行递归排序
}
}
// 解析并排序字符串
void sortString(char *str) {
char *token = strtok(str, ",");
int numCount = 1;
int *numbers = malloc(sizeof(int) * numCount);
numbers[0] = atoi(token);
while (token != NULL) {
token = strtok(NULL, ",");
numbers[numCount++] = atoi(token);
}
quickSort(numbers, 0, numCount - 1);
int j = 0;
for (int i = 0; i < numCount; i++) {
printf("%d,", numbers[i]);
// 当遍历完数组后再输出最后一个元素,不需要逗号
if (i == numCount - 1) {
printf("%d", numbers[i]);
}
if (j < numCount - 1) {
printf(","); // 除了最后一个元素外,每两个数之间插入逗号
j++;
}
}
free(numbers);
}
int main() {
char input[] = "9,7,5,11,12,2";
sortString(input);
return 0;
}
```
阅读全文