这是2012年百度实习生笔试的题目,当时没有想明白。题目大概是这样的:数组A,前面一段是L1,后面一段L2。两个有序序列L1和L2,利用归并排序的merge,将数组A排序。要求:空间复杂度为O(1)
思路:利用原数组A的空间,两个下标i和j分别遍历L1和L2。注意:当L2当前元素较小时,会覆盖L1的元素。可以利用插入排序,将arr[j]插入到L1中。
程序c++实现:
#include <iostream>
#include <cstdlib>
using namespace std;
void print(int *arr, int start, int end)
{
for (int i = start; i <= end; ++i)
cout << arr[i] << ' ';
cout << endl;
}
void randData(int *arr, int start, int end)
{
for (int i = start; i <= end; ++i)
arr[i] = rand() % 20;
print(arr, start, end);
}
void merge(int *arr, int start, int mid, int end)
{
int i, j, k, key;
i = start;
j = mid;
while (i < j && j <= end) //当i等于j或者j到达末尾时终止
{
if (arr[i] > arr[j])
{
k = j;
key = arr[j];
while (k