合并有序子数组的算法问题

清风醉林 2013-03-11 10:07:07
子数组a[0:k-1]和a[k:n-1]已排序(0<=k<=n-1),将这两个数组合并为一个有序的数组a[0:n-1],要求时间复杂度为O(n),并且只能用O(1)的空间复杂度。
代码如下:

#include <iostream>
using namespace std;


template<typename T>
int BinarySearch(T a[], const T& x, int nLeft, int nRight)
{
int nMiddle;
while (nLeft <= nRight)
{
nMiddle = (nLeft + nRight) / 2;
if (x == a[nMiddle])
return nMiddle;
if (x > nMiddle)
nLeft = nMiddle + 1;
else
nRight = nMiddle - 1;
}
if (x > a[nMiddle])
return nMiddle;
else
return nMiddle - 1;
}

template<typename T>
void ShiftLeft(T a[], int s, int t, int k)
{
T temp;
for (int i = 0; i < k; i++)
{
temp = a[t];
for (int j = t; j > s; j--)
a[j] = a[j - 1];
a[s] = temp;
}
}

template<typename T>
void Mergefor(T a[], int k, int n)
{
int i = 0;
int j = k;
int p;
while (i < j && j < n)
{
p = BinarySearch(a, a[i], j, n - 1);
ShiftLeft(a, i, p, p - j + 1);
i += j - p + 2;
j = p + 1;
}
}

int _tmain(int argc, _TCHAR* argv[])
{
int a[10] = {3, 5, 6, 7, 16, 2, 8, 9, 11, 12};
int b[10] = {3, 5, 6, 7, 16, 2, 4, 9, 11, 12};
Mergefor(a, 5, 10);
Mergefor(b, 5, 10);
for (int i = 0; i < 10; i++)
cout<<a[i]<<" ";
cout<<endl;
for (int j = 0; j < 10; j++)
cout<<b[j]<<" ";
cout<<endl;
return 0;
}

为什么a[10]的结果是对的,b[10]的结果是错的?
...全文
313 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
cnmhx 2013-03-16
  • 打赏
  • 举报
回复
子数组a[0:k-1]和a[k:n-1]已排序(0<=k<=n-1),将这两个数组合并为一个有序的数组a[0:n-1], ——这有标准算法。 要求时间复杂度为O(n),并且只能用O(1)的空间复杂度。 ——这个提法有问题。O(n)的空间复杂度。
Hony杨 2013-03-13
  • 打赏
  • 举报
回复
时间复杂度o(n)就不可能空间复杂度o(1) 空间复杂度o(1)就不可能时间复杂度o(n) 楼主请三思!
绿色夹克衫 2013-03-13
  • 打赏
  • 举报
回复
可以倒是可以,原地归并挺麻烦的。
FancyMouse 2013-03-12
  • 打赏
  • 举报
回复
in-place merge sort哪有那么简单……老老实实开个新数组merge吧。

33,010

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧