1.直接插入排序
(1)一般算法基本思想
在当前有序区R[1...i-1]中查找R[i]的正确插入位置k;将R[K...i-1]中记录均后移一位,腾出k位置上的空间插入R[i].(这里采用升序排列)
(2)改进型算法
将插入记录R[I]的关键字从右向左依次与有序区中记录R[j](j=i-1,i-2..,1)的关键字比较;如果R[j]的关键字大于R[i]的关键字,则R[j]后移一位;如果R[j]的
关键字小于或等于R[i]的关键字,则查找结束,(j+1)即为R[I]的插入位置
c语言描述
void InsertSort (SqList &L)
{
for(i=2;i<=L.length; ++i)//0号元素为临时数据,从2号元素开始遍历
if(LT(L.r[i].key, L.r[i-1].key))//第i元素小于第i-1元素
{
L.r[0] =L.r[i];//将小数放到0号位置
L.r[i] =L.r[i-1];//将第i-1元素放到第i位置
For(j=i-2;LT(L.r[0].key,L.r[j].key); --j)//倒着遍历从i-2位置开始和0号元素比较
{
L.r[j+1] = L.r[j];//将元素后移
}
L.r[j+1] = L.r[0];//找到0号元素可以放下的位置,将0号元素填进去
}
}
实例:
#include<iostream.h>
void insert_sort(int a[],int n)
{
int i,j,temp;
for(i=1;i<n;i++)
{
temp=a[i];
for(j=i-1;j>=0 && temp<=a[j];j--)
{
a[j+1]=a[j];
}
a[j+1]=temp;
}
}
void printf_array(int a[],int n)
{
int i;
for(i=0;i<n;i++)
{
cout<<a[i]<<" ";
}
cout<<endl;
}
int main(void)
{
int a[]={6,5,32,21,52};
printf_array(a,5);
insert_sort(a,5);
printf_array(a,5);
return 0;
}
2.希尔(shell)排序
基本思想:先将整个待排序记录序列分割成若干子序列分别进行直接插入排序,待整个序列“基本有序”时,
在对全体记录进行一次直接插入排序。
3. 折半排序
void BInsertSort (SqList & L)
{
for( i=2 ;i<=L.length;++i)//遍历数组
{
L.r[0] = L.r[i];//记录比较数据
Low =1;//low初始化为数组起始
high =i-1;//high初始化为数据末尾
while(low<=high)//没有比较完毕
{
m = (low + high)/2;//取一半的数
if(LT(L.r[0].key,L.r[m].key)) high =m-1;//如果待比较数小于折半的数
else low=m+1;//折半的数小于待比较数
}
for( j=i-1;j>=high+1;--j)//从high+1开始的数据后移
{
L.r[j+1] =L.r[j];
}
L.r[high+1] =L.r[0];//将0位置的数放入指定位置
}
}
4 表插入排序
基本思想:使用静态链表(数据+位置),只修改静态链表的位置指针
void LInsertionSort(Elem SL[],int n)
{
SL[0].key=MAXINT;
SL[0].next=1;
SL[1].next=0;
for(i=2;i<=n;++i)//遍历整个数组
{
for(j=0,k=SL[0].next;SL[k].key<=SL[i].key;j=k,k=SL[k].next)//遍历静态链表寻找可插入的位置
{
SL[j].next=i;
SL[j].next=k;
}
}
}
void Arrage(SLinkListType &SL)
{
p=SL.r[0].next;
for(i=1;i<SL.length;++i)
{
while(p<i)
p=SL.r[p].next;
q=SL.r[p].next;
if(p!=i)
{
SL.r[p]<--->SL.r[i];
SL.r[i].next=p;
}
p=q;
}
}