🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
# 重新排列数组,如果`i`为偶数则`arr[i] >= arr[j]`,如果`i`为奇数且`j < i`则 `arr[i] <= arr[j]` > 原文: [https://www.geeksforgeeks.org/rearrange-array-arri-arrj-even-arri/](https://www.geeksforgeeks.org/rearrange-array-arri-arrj-even-arri/) 给定 n 个元素的数组。 我们的任务是编写一个程序来重新排列数组,以使偶数位置的元素大于其之前的所有元素,奇数位置的元素小于其之前的所有元素。 **示例**: ``` Input : arr[] = {1, 2, 3, 4, 5, 6, 7} Output : 4 5 3 6 2 7 1 Input : arr[] = {1, 2, 1, 4, 5, 6, 8, 8} Output : 4 5 2 6 1 8 1 8 ``` 解决此问题的想法是,首先创建原始数组的辅助副本,然后对复制的数组进行排序。 现在,具有 n 个元素的数组中偶数位置的总数将为`floor(n / 2)`,其余为奇数位置的数量。 现在,以以下方式使用排序后的数组填充原始数组中的奇数和偶数位置: * 总奇数位将为`n – floor(n / 2)`。 从已排序数组的第(`n - floor(n / 2)`)个位置开始,然后将元素复制到已排序数组的第一个位置。 从此位置开始向左遍历已排序的数组,并继续向右填充原始数组中的奇数位置。 * 从第(`n - floor(n / 2) + 1`)个位置开始向右遍历已排序的数组,并从第 2 个位置开始继续填充原始数组。 以下是上述想法的实现: ## C++ ```cpp // C++ program to rearrange the array // as per the given condition #include <bits/stdc++.h> using namespace std; // function to rearrange the array void rearrangeArr(int arr[], int n) {     // total even positions     int evenPos = n / 2;     // total odd positions     int oddPos = n - evenPos;     int tempArr[n];     // copy original array in an     // auxiliary array     for (int i = 0; i < n; i++)         tempArr[i] = arr[i];     // sort the auxiliary array     sort(tempArr, tempArr + n);     int j = oddPos - 1;     // fill up odd position in original     // array     for (int i = 0; i < n; i += 2) {         arr[i] = tempArr[j];         j--;     }     j = oddPos;     // fill up even positions in original     // array     for (int i = 1; i < n; i += 2) {         arr[i] = tempArr[j];         j++;     }     // display array     for (int i = 0; i < n; i++)         cout << arr[i] << " "; } // Driver code int main() {     int arr[] = { 1, 2, 3, 4, 5, 6, 7 };     int size = sizeof(arr) / sizeof(arr[0]);     rearrangeArr(arr, size);     return 0; } ```