diff --git a/Algorithms/C/Merge_sort.c b/Algorithms/C/Merge_sort.c new file mode 100644 index 00000000..37aabe35 --- /dev/null +++ b/Algorithms/C/Merge_sort.c @@ -0,0 +1,81 @@ +#include +#include + +// 合并两个有序子数组 arr[l..m] 和 arr[m+1..r] +void merge(int arr[], int l, int m, int r) { + int i, j, k; + int n1 = m - l + 1; + int n2 = r - m; + + // 创建临时数组 + int *L = (int*)malloc(n1 * sizeof(int)); + int *R = (int*)malloc(n2 * sizeof(int)); + + // 拷贝数据到临时数组 + for (i = 0; i < n1; i++) + L[i] = arr[l + i]; + for (j = 0; j < n2; j++) + R[j] = arr[m + 1 + j]; + + // 合并临时数组回 arr[l..r] + i = 0; + j = 0; + k = l; + while (i < n1 && j < n2) { + if (L[i] <= R[j]) { + arr[k] = L[i]; + i++; + } else { + arr[k] = R[j]; + j++; + } + k++; + } + + // 拷贝剩余元素 + while (i < n1) { + arr[k] = L[i]; + i++; + k++; + } + while (j < n2) { + arr[k] = R[j]; + j++; + k++; + } + + free(L); + free(R); +} + +// 归并排序递归函数 +void mergeSort(int arr[], int l, int r) { + if (l < r) { + int m = l + (r - l) / 2; // 防止溢出 + mergeSort(arr, l, m); + mergeSort(arr, m + 1, r); + merge(arr, l, m, r); + } +} + +// 打印数组 +void printArray(int arr[], int size) { + for (int i = 0; i < size; i++) + printf("%d ", arr[i]); + printf("\n"); +} + +// 测试示例 +int main() { + int arr[] = {12, 11, 13, 5, 6, 7}; + int arr_size = sizeof(arr) / sizeof(arr[0]); + + printf("原始数组: "); + printArray(arr, arr_size); + + mergeSort(arr, 0, arr_size - 1); + + printf("排序后数组: "); + printArray(arr, arr_size); + return 0; +} \ No newline at end of file