给定一个大小为N的数组A[] ,任务是使用就地合并排序按递增顺序对数组进行排序。
例子:
Input: A = {5, 6, 3, 2, 1, 6, 7}
Output: {1, 2, 3, 5, 6, 6, 7}
Input: A = {2, 3, 4, 1}
Output: {1, 2, 3, 4}
做法:思路是使用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