插入排序:就是对已经有序的序列,插入元素保持有序,插入排序有 直接插入排序,折半插入排序,shell排序等。
其中shell排序(又称缩小增量排序) 的时间复杂度较低的插入排序,是一种不稳定的排序。
#include<iostream>
using namespace std;
typedef struct
{
int key;
}R;
typedef struct
{
int length;
R r[100];
}SqList;
void shellsort(SqList &L,int delta[],int m);
void shellinsert(SqList &L,int m);
int main()
{
int n;
int delta[]={5,3,1};//增量的选取。
while(cin>>n)
{
SqList L;
L.length=n;
int i,j,k;
for(i=1;i<=n;i++)
cin>>L.r[i].key;
shellsort(L,delta,3);
for(j=1;j<=n;j++)
cout<<L.r[j].key<<" ";
cout<<endl;
}
return 0;
}
void shellsort(SqList &L,int delta[],int m)
{
int i,j,k;
for(i=0;i<m;i++)
{
shellinsert(L,delta[i]);
}
}
void shellinsert(SqList &L,int c)
{
int i,j,k;
for(i=c+1;i<=L.length;i++)
{
if(L.r[i].key<L.r[i-c].key)
{
R t=L.r[i];
for(j=i-c;j>0&&t.key<L.r[j].key;j=j-c)
{
L.r[j+c]=L.r[j];
}
L.r[j+c]=t;
}
}
}