1、直接插入排序
2、折半插入排序
3、希尔插入排序
代码:
#include<iostream>
using namespace std;
#define MAXSIZE 100
typedef int KeyType;
typedef char InfoType;
typedef struct{
KeyType key;
InfoType otherinfo;
}RedType;
typedef struct{
RedType *r;
int length;
}SqList;
//初始化
int Init_Sq(SqList &L){
L.r=new RedType[MAXSIZE];
L.length=0;
return 1;
}
//创建
void Create_Sq(SqList &L,int a[],int n){
for(int i=1;i<=n;i++){
L.r[i].key=a[i-1];
L.length++;
}
}
//显示
void Show_Sq(SqList L){
for(int i=0;i<=L.length;i++) cout<<L.r[i].key<<' ';
cout<<endl;
}
//直接插入排序
void InsertSort(SqList &L){
int i,j;
for(i=2;i<=L.length;++i){
if(L.r[i].key<L.r[i-1].key){ //第i位元素比i-1元素小,需要排序
L.r[0]=L.r[i]; //复制为“哨兵”
for(j=i-1;L.r[j].key>L.r[0].key;--j) L.r[j+1]=L.r[j]; //记录后移
L.r[j+1]=L.r[0]; //插入
}
}
}
//折半插入排序
void BInsertSort(SqList &L){
int i,j;
for(i=2;i<=L.length;++i){
L.r[0]=L.r[i]; //哨兵
int low=1,high=i-1; //二分法查找
while(low<=high){
int mid=(low+high)/2;
if(L.r[0].key<L.r[mid].key) high=mid-1;
else low=mid+1;
}
for(j=i-1;j>=high+1;--j) L.r[j+1]=L.r[j]; //移动元素
L.r[high+1]=L.r[0]; //插入
}
}
//希尔插入排序
void ShellInsert(SqList &L,int dk){
int i,j;
for(i=dk+1;i<=L.length;i++){
if(L.r[i].key<L.r[i-dk].key){ //需要排序
L.r[0]=L.r[i]; //哨兵
for(j=i-dk;L.r[j].key>L.r[0].key;j=j-dk) L.r[j+dk]=L.r[j]; //后移
L.r[j+dk]=L.r[0]; //插入
}
}
}
void ShellSort(SqList &L,int dlta[],int t){
for(int k=0;k<t;k++)
ShellInsert(L,dlta[k]); //一趟增量为dlta[k]的插入排序
}
int main(){
SqList L;
int a[]={3,5,10,16,7,32,83,23,54,29,96};
int dlta[]={5,3,1}; //希尔排序增量序列
Init_Sq(L);
Create_Sq(L,a,11);
cout<<"排序前:";
Show_Sq(L);
// InsertSort(L);
// cout<<"直接插入排序后:";
// Show_Sq(L);
// BInsertSort(L);
// cout<<"折半插入排序后:";
// Show_Sq(L);
ShellSort(L,dlta,3);
cout<<"希尔插入排序后:";
Show_Sq(L);
return 1;
}
运行结果:
注:第0号位置为“哨兵”