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

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来说。

...全文
4182 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
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


3,882

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 其它技术问题
社区管理员
  • 其它技术问题社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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