📜  就地合并排序 | 2套

📅  最后修改于: 2021-09-03 03:55:17             🧑  作者: Mango

给定一个大小为N的数组A[] ,任务是使用就地合并排序按递增顺序对数组进行排序。

例子:

做法:思路是使用inplace_merge()函数在O(1)空间合并排序后的数组。请按照以下步骤解决问题:

  • 创建一个递归函数mergeSort() ,它接受数组的开始和结束索引作为参数。现在,执行以下步骤:
    • 如果数组的大小等于 1,则简单地从函数返回。
    • 否则,计算中间索引以将数组拆分为两个子数组。
    • 对左右子数组递归调用mergeSort() ,分别对它们进行排序。
    • 然后,调用inplace_merge()函数合并两个子数组
  • 完成上述步骤后,打印排序后的数组A[]

下面是上述方法的实现:

C++
// C++ program for the above approach
#include 
#define it vector::iterator
using namespace std;
 
// Recursive function to split the array
// into two subarrays and sort them
void mergeSortUtil(it left, it right)
{
    // Handle the base case
    if (right - left <= 1)
        return;
 
    // Otherwise, find the middle index
    it mid = left + (right - left) / 2;
 
    // Recursively sort
    // the left subarray
    mergeSortUtil(left, mid);
 
    // Recursively sort
    // the right subarray
    mergeSortUtil(mid, right);
 
    // Merge the two sorted arrays using
    // inplace_merge() function
    inplace_merge(left, mid, right);
 
    return;
}
 
// Function to sort the array
// using inplace Merge Sort
void mergeSort(vector arr)
{
    // Recursive function to sort the array
    mergeSortUtil(arr.begin(), arr.end());
 
    // Print the sorted array
    for (int el : arr)
        cout << el << " ";
}
 
// Driver Code
int main()
{
    vector arr = { 5, 6, 3, 2, 1, 6, 7 };
 
    mergeSort(arr);
 
    return 0;
}


输出:
1 2 3 5 6 6 7

时间复杂度: O(N * log(N))
辅助空间: O(1)

替代方法:请参阅上一篇文章,了解解决此问题的其他方法。

如果您想与行业专家一起参加直播课程,请参阅Geeks Classes Live