#include<stdio.h>
#include<stdlib.h>
#define Status int
#define max 20
typedef struct {
Status key;
}ElemType;
typedef struct {
ElemType r[max];
int length;
}Sqlist;
void Inital(Sqlist &L) //初始化
{
L.r[1].key=49;
L.r[2].key=38;
L.r[3].key=65;
L.r[4].key=97;
L.r[5].key=76;
L.r[6].key=13;
L.r[7].key=27;
L.r[8].key=49;
L.length=8;
}
bool LT(int i,int j)
{
if(i<j)
return true;
else return false;
}
bool RT(int i,int j)
{
if(i>j)
return true ;
else return false ;
}
void TowrodeInsertsort(Sqlist &l) //2-路插入排序函数
{
int i,j,m,n;
int frist,final;
ElemType d1[max]; //创建一个可以容纳n个记录的辅助空间d1;
d1[0]=l.r[1]; //先将原序列中的第一个记录作为排好序列中处于中间位置的记录
frist=final=0; //两个指针,分别指向排序序列中的第一个记录和最后一个记录的位置
for(i=2;i<=l.length;i++)
{
if(LT(l.r[i].key,d1[frist].key)) // 当要插入的记录小于d1中的最小值,让frist-1再插入到frist的位置(不需要移动d1)
{
frist=(frist-1+l.length)%l.length;
d1[frist]=l.r[i];
}
else if(RT(l.r[i].key,d1[final].key)) //当要插入的记录大于d1中的最大值,让final+1 再插入到final的位置(不需要移动d1)
{
final++;
d1[final]=l.r[i];
}
else //当要插入的记录大于d1最小值而又小于d1最大值,用while循环判断并移动d1直到找到插入点
{
j=final++;
while(LT(l.r[i].key,d1[j].key)) //记录移动
{
d1[(j+1+l.length)%l.length]=d1[j]; //大的数往后移动一位
j=(j-1+l.length)%l.length; //指针j的值-1
}
d1[j+1]=l.r[i]; //记录插入到合适的位置
}
}
for(i=1;i<=l.length;i++)
{
l.r[i]=d1[(i+frist-1)%l.length]; //需要将辅助空间排好序的序列依次输入到原序列的存储空间
}
}
void print(Sqlist l)//排序
{
int i;
printf("排序后的结果为:");
for(i=1;i<=l.length;i++)
{
printf("%d ",l.r[i].key);
}
}
void main()
{
Sqlist l;
Inital(l);
TowrodeInsertsort(l);
print(l);
getchar();
getchar();
}
//算法分析:1.2-路插入排序目的是减少排序过程中移动次数的减少
//2.需要n个记录的辅助空间
排序算法-------2-路插入排序
最新推荐文章于 2021-05-11 14:19:06 发布