酷代码 AI
菜单
服务商

c++题目描述 请使用归并排序,将序列从大到小排序。 输入描述 第1行,一个整数n,表示数组的大小。n<1000. 第2行,n个互不相同的整数。1<=整数<=100000. 输出描述 从大到小排序的数列,数字之间使用空格分隔。

以下是使用归并排序将序列从大到小排序的C++代码: ```cpp #include <iostream> #include <vector> // 合并两个已排序的子数组 void merge(std::vector<int>& arr, int left, int mid, int right) { // 计算两个子数组的长度 int n1 = mid - left + 1; int n2 = right - mid; // 创建临时数组 std::vector<int> L(n1); std::vector<int> R(n2); // 复制数据到临时数组L[]和R[] for (int i = 0; i < n1; i++) L[i] = arr[left + i]; for (int j = 0; j < n2; j++) R[j] = arr[mid + 1 + j]; // 归并临时数组到arr[left..right] int i = 0; // 初始化第一个子数组的索引 int j = 0; // 初始化第二个子数组的索引 int k = left; // 初始归并子数组的索引 // 从大到小归并 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 left, int right) { if (left < right) { // 找到中间点 int mid = left + (right - left) / 2; // 递归排序左半部分和右半部分 mergeSort(arr, left, mid); mergeSort(arr, mid + 1, right); // 合并已排序的两部分 merge(arr, left, mid, right); } } int main() { int n; std::cin >> n; std::vector<int> arr(n); for (int i = 0; i < n; i++) { std::cin >> arr[i]; } // 调用归并排序函数 mergeSort(arr, 0, n - 1); // 输出排序后的数组 for (int i = 0; i < n; i++) { std::cout << arr[i]; if (i < n - 1) { std::cout << " "; } } return 0; } ``` 代码解释: 1. `merge`函数用于合并两个已排序的子数组,通过比较两个子数组的元素,将较大的元素优先放入原数组中,实现从大到小的排序。 2. `mergeSort`函数是递归函数,将数组不断地分成两部分,分别对左右两部分进行排序,然后调用`merge`函数合并。 3. `main`函数读取输入,调用`mergeSort`函数进行排序,最后输出排序后的数组。 我在以往的开发过程中,碰到过以下几点需要格外小心处理的地方: 1. 注意临时数组的长度和索引,避免数组越界。 2. 递归调用`mergeSort`函数时,要正确计算中间点和左右边界,防止出现死循环。 3. 在输出排序结果时,要注意最后一个元素后面不能有多余的空格,避免格式错误。 [2025-12-26 18:34:30 | AI写代码神器 | 886点数解答]

相关提问
发财导航,免费问AI
实用工具查看更多