📌  相关文章
📜  C++ 程序重新排列数组,如果 i 是偶数,则 arr[i] >= arr[j] 如果 i 是奇数且 j < i,则 arr[i]<=arr[j](1)

📅  最后修改于: 2023-12-03 14:39:55.986000             🧑  作者: Mango

重新排列数组使得符合条件

在本题中,我们需要重新排列一个整型数组,以满足以下条件:

  • 对于每个偶数下标 i,arr[i] >= arr[j] ,其中 j 为任意奇数下标;
  • 对于每个奇数下标 i 且 j < i,arr[i] <= arr[j];

我们可以采用类似归并排序的方式实现。

思路

我们可以将数组分为两部分,奇数下标部分和偶数下标部分。然后先将两部分各自排好序,再将两个排好序的部分合并成一个符合条件的数组。

对于奇数下标的部分,我们将其排序方式设为从大到小排序。对于偶数下标的部分,我们将其排序方式设为从小到大排序。然后将排好序的两部分分别按照原数组的下标拼接起来即可。

代码实现
void sortArray(vector<int>& arr) {
    int len = arr.size();
    vector<int> odd, even;
    for (int i = 0; i < len; i++) {
        if (i % 2 == 0) even.push_back(arr[i]);
        else odd.push_back(arr[i]);
    }
    sort(odd.rbegin(), odd.rend()); // 逆序排列
    sort(even.begin(), even.end());
    for (int i = 0; i < len; i++) {
        if (i % 2 == 0) arr[i] = even[i / 2];
        else arr[i] = odd[i / 2];
    }
}
复杂度分析

该算法的时间复杂度为 O(nlogn) ,其中 n 为数组的长度。我们需要对奇数下标和偶数下标的部分分别进行排序,因此排序的时间复杂度为 O(nlogn) 。然后我们需要对排好序的两部分进行拼接,时间复杂度为 O(n) 。总的时间复杂度为 O(nlogn) 。

空间复杂度为 O(n) ,即我们需要额外开辟两个数组用于存储原数组的奇数下标部分和偶数下标部分。