直接插入排序的比较次数和移动次数

gyongheng 2011-10-30 07:27:16
问题是,当排序列中记录按非递增有序序列排列时,总比较次数为(n+2)(n-1)/2,移动次数为(n+4)(n-1)/2
我把n带进去怎么都不觉得对。

//数据类型如下
typedef int KeyType;
typedef struct{
KeyType key;
InforType otherinfo;
}RedType;

typedef struct{
RedType r[MAXSIZE+1];//r[0]为哨兵单元
int length;
}Sqlist;

//直接插入排序
void InsertSort(SqList& L){
for(i = 2; i <= L.length;++i){
if(L.r[i].key < L.r[i-1].key){
L.r[0] = L.[i];//哨兵
L.r[i] = L.r[i-1];
for(j = i-2;L.r[0]<L.r[j].key;--j){//移动
L.r[j+1] = L.[j];
}
L.r[j+1] = L.r[0];//插入到正确的位置
}
}
}


简单来说,对于序列 0 12 11 10 9
过程如下:
0 12 11 10 9 11 12 11 10 9 11 12 12 10 9 11 11 12 10 9
i j 移动1次

10 11 12 10 9 10 11 12 12 9 10 11 11 12 9 10 10 11 12 9
i j 移动一次 移动一次

9 10 11 12 9 9 10 11 12 12 9 10 11 11 12 9 10 10 11 12 9 9 10 11 12
i j 移动一次 移动一次 移动一次

总共才移动6次,对于n=4来说。

...全文
1931 点赞 收藏 4
写回复
4 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
myyounglife 2012-11-27
能不能讲讲呀,我也不清楚
回复
gyongheng 2011-11-19
嗯,很早想清楚了,严老师是把所有的比较和移动都算进去了。
我指的是辅助实现的直接排序的比较和移动都分别算进时间复杂度里面了。
[Quote=引用 2 楼 jixingzhong 的回复:]

额,这个再仔细想想......
[/Quote]
回复
jixingzhong 2011-10-30
额,这个再仔细想想......
回复
gyongheng 2011-10-30

n (n+4)(n-1)/2
n=1 0
n=2 3
n=3 7
n=4 12
n=5 18


回复
相关推荐
发帖
其它技术问题
创建于2007-09-28

3849

社区成员

C/C++ 其它技术问题
申请成为版主
帖子事件
创建了帖子
2011-10-30 07:27
社区公告
暂无公告