Untitled
#include <iostream> #include <vector> // 合并两个子数组的函数 // firstHalf 是指向第一个子数组的起始指针 // secondHalf 是指向第二个子数组的起始指针 // mid 是第一个子数组的结束位置 // end 是整个数组的结束位置 void merge(std::vector<int>& arr, int firstHalf, int mid, int end) { int n1 = mid - firstHalf + 1; // 第一个子数组的元素数量 int n2 = end - mid; // 第二个子数组的元素数量 // 创建临时数组 std::vector<int> L(n1), R(n2); // 拷贝数据到临时数组 L 和 R for (int i = 0; i < n1; i++) L[i] = arr[firstHalf + i]; for (int j = 0; j < n2; j++) R[j] = arr[mid + 1 + j]; // 合并临时数组回到原数组 int i = 0; // 临时数组 L 的索引 int j = 0; // 临时数组 R 的索引 int k = firstHalf; // 原数组的索引 while (i < n1 && j < n2) { if (L[i] <= R[j]) { arr[k] = L[i]; i++; } else { arr[k] = R[j]; j++; } k++; } // 拷贝 L 中剩余的元素 while (i < n1) { arr[k] = L[i]; i++; k++; } // 拷贝 R 中剩余的元素 while (j < n2) { arr[k] = R[j]; j++; k++; } } // 递归函数,用于归并排序 void mergeSort(std::vector<int>& arr, int firstHalf, int end) { if (end - firstHalf > 1) { int mid = firstHalf + (end - firstHalf) / 2; // 寻找中点 mergeSort(arr, firstHalf, mid); // 排序左半部分 mergeSort(arr, mid + 1, end); // 排序右半部分 merge(arr, firstHalf, mid, end); // 合并两个子数组 } } int main() { std::vector<int> arr = {12, 11, 13, 5, 6, 7}; int arrSize = arr.size(); mergeSort(arr, 0, arrSize - 1); // 调用归并排序函数 std::cout << "Sorted array: "; for (int i = 0; i < arrSize; i++) { std::cout << arr[i] << " "; } std::cout << std::endl; return 0; }
Leave a Comment