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

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;
}
}



...全文
84 1 收藏 3
写回复
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次)

回复
发动态
发帖子
C++ 语言
创建于2007-09-28

5.9w+

社区成员

C++ 语言相关问题讨论,技术干货分享,前沿动态等
申请成为版主
社区公告
暂无公告