#include <stdio.h>
#include <stdlib.h>
// 合并两个有序子数组
void merge(int arr[], int temp[], int left, int mid, int right) {
int i = left; // 左子数组的起始索引
int j = mid + 1; // 右子数组的起始索引
int k = left; // 合并后数组的起始索引
while (i <= mid && j <= right) {
if (arr[i] <= arr[j]) {
temp[k++] = arr[i++]; // 将左子数组中较小的值放入合并后的数组
} else {
temp[k++] = arr[j++]; // 将右子数组中较小的值放入合并后的数组
}
}
while (i <= mid) {
temp[k++] = arr[i++]; // 将剩余的左子数组元素放入合并后的数组
}
while (j <= right) {
temp[k++] = arr[j++]; // 将剩余的右子数组元素放入合并后的数组
}
for (int m = left; m <= right; m++) {
arr[m] = temp[m]; // 将合并后的数组拷贝回原数组的相应位置
}
}
// 归并排序
void mergeSort(int arr[], int temp[], int left, int right) {
if (left == right) {
return; // 当数组长度为1,即左右指针指向同一个位置时,结束递归
}
int mid = left + (right - left) / 2; // 求出中间位置
mergeSort(arr, temp, left, mid); // 对左半边数组进行递归拆分
mergeSort(arr, temp, mid + 1, right); // 对右半边数组进行递归拆分
merge(arr, temp, left, mid, right); // 合并拆分后的两个有序子数组
}
// 打印数组元素
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 arrSize = sizeof(arr) / sizeof(arr[0]);
int* temp = (int*)malloc(arrSize * sizeof(int)); // 创建临时数组,用于合并操作
mergeSort(arr, temp, 0, arrSize - 1); // 调用归并排序函数
printf("排序后的数组:");
printArray(arr, arrSize);
free(temp); // 释放临时数组的内存空间
return 0;
}