您的位置:首页 > 其它

插入排序、折半插入排序、希尔排序(缩小增量排序)

2017-11-16 11:15 417 查看

待排序的记录序列的3中存储方式

顺序表

静态链表,对指针(存储的数组下标)进行排序

另设一个指示各个记录数据的地址位置的地址向量,对存储对地址进行排序

存储结构

typedef struct{
Keytype key;
InfoType info;
}RedType;

typedef struct{
RedType r[MAXSIXE+1]; //r[0]位置作为哨兵单元
int length;
}SqList;


插入排序

将一个记录插入到已排好序的有序表中,从而得到一个新的、记录数增 1 的有序表。

void insertSort(SqList &L){
int i=0,j=0;
for(int i=2;i<L.length;i++){
if(L.r[i].key<L.r[i-1].key){
L.r[0] = L.r[i];
L.r[i] = L.r[i-1];
for(j = i-2;L.r[0].key<L.r[j].key;j--){
L.r[j+1] = L.r[j];
}
L.r[j+1] = L.r[0];
}
}
}


折半插入排序

在插入排序的基础上,改变比较的方式,使用二分查找法找到插入位置,再把所有大于(小于)关键字的记录后移,并插入到关键位置。

希尔排序(缩小增量排序)

算法思想:先将整个待排序的记录序列分割成若干个子序列并分别进行直接插入排序,待整个序列中的记录“基本有序”时,再对全体记录进行一次直接插入排序。

子序列的构成不是简单的“逐段分割”,而是将相隔某个“增量”的记录组成一个子序列。

逐次缩小增量,如5,3,1



void shellInsert(SqList &L,int increment){
int i=0,j=0;
for(i=increment+1;i<L.length;i++){
if(L.r[i].key<L.r[i-increment].key){
L.r[0] = L.r[i];
L.r[i] = L.r[i-1];
for(j = i-increment;L.r[0].key<L.r[j].key;j-=increment){
L.r[j+increment] = L.r[j];
}
L.r[j+increment] = L.r[0];
}
}
}

void shellSort(SqList &L,int dlta[],int t){
for(int k=0;k<t;++k){
shellInsert(L,dlta[k]);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐