二分插入排序的复杂度,谁给推导一下

starcat 2010-05-27 11:49:12
时间复杂度:T(n)=O(n^2)
空间复杂度:S(n)=O(n)

template<class T>
void Binary_InsertionSort(T a[], int n)
{
int i, j, s, m, k;
T x;
for(i = 1; i < n; i++)
{
x = a[i];
s = 0;
j = i - 1;
while(s <= j)
{
m = (s + j) / 2;
if(x < a[m]) j = m - 1;
else s = m + 1;
}
for(k = i - 1; k >= s; k--)
a[k+1] = a[k];
a[s] = x;
}
}



...全文
348 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
patricxuqi 2010-05-28
  • 打赏
  • 举报
回复
空间上只借用了一个T x作为temp。复杂度为O(1)。
selooloo 2010-05-28
  • 打赏
  • 举报
回复
template<class T>
void Binary_InsertionSort(T a[], int n)
{
int i, j, s, m, k;
T x;
for(i = 1; i < n; i++)//这里循环n-1次
{
x = a[i];
s = 0;
j = i - 1;
while(s <= j)//这里循环i次
{
m = (s + j) / 2;
if(x < a[m]) j = m - 1;
else s = m + 1;
}
for(k = i - 1; k >= s; k--)//这里也循环i次
a[k+1] = a[k];
a[s] = x;
}
}

如果只有while(s <= j)它的循环次数为 n-1+n-2+n-3,...,3+2+1(共n-1个)
加上for(k = i - 1; k >= s; k--)//
循环次数就是
n-1+n-2+n-3,...,3+2+1+n-1+n-2+n-3,...,3+2+1=n+n+n...+n(共n-1个)
结果就是n*(n-1) 也就是n*n

lnuyasha_hrb 2010-05-28
  • 打赏
  • 举报
回复
时间复杂度为内层循环数*外层循环数
外层循环为n-1
内层循环为while(s <= j)与for(k = i - 1; k >= s; k--)的最大值

而while(s <= j)和for(k = i - 1; k >= s; k--)的时间复杂度最大不会超过n-1

所以 (n-1)*(n-1) 时间复杂度为 n*n

空间复杂度 肯定为n(外层循环了n-1次)

64,649

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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