直接插入排序的比较次数和移动次数
问题是,当排序列中记录按非递增有序序列排列时,总比较次数为(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来说。