目录
1.直接插入排序
1.直接插入排序的思想
直接插入排序是一种简单的插入排序方法,基本思想:在R[1]至R[i-1]长度为i-1的子表已经有序的情况下,将Ri插入,得到R[1]至R[i]长度为i的子表有序,这样通过n-1趟(i=2...n)之后,R[1]至R[n]有序。
例如,对于以下序列(为简便起见每个记录只列出排序码,用排序码代表记录)
[10 18 20 36 60 ] 25 30 18 12 56
其中,前5个记录组成的子序列是有序的,这时要将第6个记录插入到前5个记录组成的有序子序列中去,得到一个含有6个记录的新有序列。完成这个插入首先需要找到插入位置:20<25<36,因此25应插入到记录20和记录36之间,从而得到新序列:[10 18 20 25 36 60 ] 30 18 12 56
这就是一趟直接插入排序的过程。
可以看出,将Ri插入到子序列R[1]…R[i-1]的过程,首先是进行顺序查找以便确定插入位置,然后移动数据,可以将两者同时进行,自R[i-1]开始向前进行搜索,搜索过程中同时后移记录。
初始状态下,认为长度为1的子表是有序的,因此对n个记录的表,可从第2个记录开始直到第n个记录,逐个向有序表中进行插入操作,从而使得n个记录按关键码有序
2.直接插入排序的算法
void Insertion_Sort(int A[],int N)
{
int P,i,tmp;
for(P=1;P<N;P++)
{
tmp=A[P];
for(i=P;i>0&&A[i-1]>tmp;i--)
{
A[i]=A[i-1];
}
A[i]=tmp;
}
}
2.希尔排序
1.希尔排序的思想
先选取一个小于n的整数di(称之为步长),然后把排序表中的n个记录分为di个组,从第一个记录开始,间隔为di的记录为同一组,各组内进行直接插入排序,一趟之后,间隔di的记录有序,随着有序性的改善,减小步长di,重复进行,直到di=1,使得间隔为1的记录有序,也就使整体达到了有序。
2.希尔排序的算法
void Shell_sort(int A[],int N)
{
int P,D;
int i;
int tmp;
for(D=N/2;D>0;D/=2)//这里的增量D简单处理取一半,可根据需要改动
{
for(P=D;P<N;P++)
{
tmp=A[P];
for(i=P;i>=D&&A[i-D]>tmp;i-=D)
A[i]=A[i-D];
A[i]=tmp;
}
}
}