#include <stdio.h> #include <stdlib.h> #include <string.h> void merge(char** arr, int left, int mid, int right) { int i, j, k; int n1 = mid - left + 1; int n2 = right - mid; char** leftArr = (char**)malloc(n1 * sizeof(char*)); char** rightArr = (char**)malloc(n2 * sizeof(char*)); for (i = 0; i < n1; i++) leftArr[i] = arr[left + i]; for (j = 0; j < n2; j++) rightArr[j] = arr[mid + 1 + j]; i = 0; j = 0; k = left; while (i < n1 && j < n2) { if (strlen(leftArr[i]) <= strlen(rightArr[j])) { arr[k] = leftArr[i]; i++; } else { arr[k] = rightArr[j]; j++; } k++; } while (i < n1) { arr[k] = leftArr[i]; i++; k++; } while (j < n2) { arr[k] = rightArr[j]; j++; k++; } free(leftArr); free(rightArr); } void mergeSort(char** arr, int n) { int currSize; int leftStart; for (currSize = 1; currSize <= n - 1; currSize = 2 * currSize) { for (leftStart = 0; leftStart < n - 1; leftStart += 2 * currSize) { int mid = leftStart + currSize - 1; int rightEnd = (leftStart + 2 * currSize - 1) < (n - 1) ? (leftStart + 2 * currSize - 1) : (n - 1); merge(arr, leftStart, mid, rightEnd); } } } int main() { char inputFileName[100]; char outputFileName[100]; printf("請輸入輸入檔案名稱:"); scanf("%s", inputFileName); printf("請輸入輸出檔案名稱:"); scanf("%s", outputFileName); FILE* inputFile = fopen(inputFileName, "r"); FILE* outputFile = fopen(outputFileName, "w"); if (inputFile == NULL) { printf("無法開啟輸入檔案。\n"); return 1; } if (outputFile == NULL) { printf("無法建立輸出檔案。\n"); return 1; } char** strings = NULL; char buffer[100]; int count = 0; while (fgets(buffer, sizeof(buffer), inputFile) != NULL) { buffer[strcspn(buffer, "\n")] = '\0'; strings = (char**)realloc(strings, (count + 1) * sizeof(char*)); strings[count] = (char*)malloc((strlen(buffer) + 1) * sizeof(char)); strcpy(strings[count], buffer); count++; } mergeSort(strings, count); for (int i = 0; i < count; i++) { fprintf(outputFile, "%s\n", strings[i]); } for (int i = 0; i < count; i++) { free(strings[i]); } free(strings); fclose(inputFile); fclose(outputFile); printf("排序完成並將結果寫入輸出檔案。\n"); return 0; }
时间: 2024-01-14 19:02:19 浏览: 64
#include <stdio.h>
这是一个使用归并排序对字符串数组进行排序的程序,主要包括merge函数和mergeSort函数。merge函数用于将两个有序的子数组合并成一个有序数组,mergeSort函数则通过递归地将数组划分成两个子数组,直到子数组中只有一个元素,然后再逐层合并子数组,最终得到完整的有序数组。程序中还包括从文件中读取字符串数组、输出有序字符串数组到文件中以及动态分配内存等操作,使得程序具有较好的可扩展性和灵活性。
阅读全文