#include #include // 函数声明 void merge(int arr[], int left, int middle, int right); void mergeSort(int arr[], int left, int right); void printArray(int arr[], int size); // 归并函数 void merge(int arr[], int left, int middle, int right) { int i, j, k; int n1 = middle - left + 1; int n2 = right - middle; // 创建临时数组 int *L = (int *)malloc(n1 * sizeof(int)); int *R = (int *)malloc(n2 * sizeof(int)); // 拷贝数据到临时数组 L[] 和 R[] for (i = 0; i < n1; i++) L[i] = arr[left + i]; for (j = 0; j < n2; j++) R[j] = arr[middle + 1 + j]; // 合并临时数组 i = 0; // 初始索引 L j = 0; // 初始索引 R k = left; // 初始索引合并数组 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) {// 拷贝 L[] 的剩余元素 arr[k] = L[i]; i++; k++; } while (j < n2) { // 拷贝 R[] 的剩余元素 arr[k] = R[j]; j++; k++; } free(L); free(R); // 释放临时数组内存 } // 归并排序函数 void mergeSort(int arr[], int left, int right) { if (left < right) { //int middle = left + (right - left) / 2; int middle = (left+right)/2; mergeSort(arr, left, middle); // 递归调用归并排序 mergeSort(arr, middle + 1, right); merge(arr, left, middle, right); // 合并排序后的子数组 } } // 打印数组 void printArray(int arr[], int size) { for (int i = 0; i < size; i++) { printf("%d ", arr[i]); } printf("\n"); } int main() { int arr[] = {8, 7, 6, 15, 4, 3, 2, 10}; int arrSize = sizeof(arr) / sizeof(arr[0]); printf("原始数组: "); printArray(arr, arrSize); mergeSort(arr, 0, arrSize - 1); printf("排序后的数组: "); printArray(arr, arrSize); return 0; }