关于几种插入排序:直接插入排序,折半插入排序,希尔排序,解释在代码中给出
#include<bits/stdc++.h>
using namespace std;
#define MAXSIZE 20
typedef int KeyType;
int num[12]={0,3,5,10,16,7,32,89,23,54,29,96};
int D[3]={5,3,1};
typedef struct {//记录每个数据元素的结构
KeyType key;//关键字
//Other 其他关键字
}RedType;//Record Type
typedef struct{
RedType r[MAXSIZE+1];//r[0]一般做哨兵或者缓冲区
int length;//顺序表的长度
}SqList;
void SqListInsert(SqList &L){
L.length=0;
for(int i=1;i<12;i++) {
L.length++;
L.r[L.length].key=num[i];
}
}
//直接插入排序法
void InsertSort(SqList &L){
int i,j;
for(i=2;i<=L.length;i++){
if(L.r[i].key<L.r[i-1].key){//按照key排序,应该整体移动
L.r[0]=L.r[i];
for(j=i-1;L.r[0].key<L.r[j].key;j--){
L.r[j+1]=L.r[j];//整体移动
//L.r[j+1].key=L.r[j].key;不对 ,如果只有一个key可以
}
L.r[j+1]=L.r[0];
}
}
}
//折半插入排序
void BInsertSort(SqList &L){
for(int i=2;i<=L.length;i++){
L.r[0]=L.r[i];
int l=1,r=i-1,mid;
while(l<=r){
mid=l+r>>1;
if(L.r[0].key<L.r[mid].key) r=mid-1;
else l=mid+1;
}//此时r+1就是我插入该元素的位置
for(int j=i-1;j>=r+1;j--) L.r[j+1]=L.r[j];
L.r[r+1]=L.r[0];
}
}
//希尔排序
void ShellInsert(SqList &L,int d){//个人理解希尔排序就是间隔变大的直接插入排序,然后间隔慢慢缩小
int i,j;
for(i=d+1;i<=L.length;i++){
if(L.r[i].key<L.r[i-d].key){
L.r[0]=L.r[i];
for(j=i-d;j>0&&(L.r[0].key<L.r[j].key);j=j-d){
L.r[j+d]=L.r[j];
}
L.r[j+d]=L.r[0];
}
}
}
void ShellSort(SqList &L,int dlta[],int t){
//按增量dlta中的元素进行希尔排序
/*
希尔排序增量应该满足:
增量序列必须递减
必须互质
并且最后一个元素为1的性质
*/
for(int i=0;i<t;i++) ShellInsert(L,dlta[i]);//一趟增量为dlta[i]的插入排序
}
int main(){
SqList L;SqListInsert(L);
puts("排序前的元素:");
for(int i=1;i<=L.length;i++) cout<<L.r[i].key<<" ";
cout<<endl;
puts("-----------------插入排序Begin()---------------------");
SqListInsert(L);
InsertSort(L);
for(int i=1;i<=L.length;i++) cout<<L.r[i].key<<" ";
cout<<endl;
puts("-----------------插入排序End()-----------------------");
cout<<endl;
puts("-----------------折半排序Begin()---------------------");
SqListInsert(L);
BInsertSort(L);
for(int i=1;i<=L.length;i++) cout<<L.r[i].key<<" ";
cout<<endl;
puts("-----------------折半排序End()-----------------------");
cout<<endl;
puts("-----------------希尔排序Begin()---------------------");
SqListInsert(L);
ShellSort(L,D,3);
for(int i=1;i<=L.length;i++) cout<<L.r[i].key<<" ";
cout<<endl;
puts("-----------------希尔排序End()-----------------------");
return 0;
}