#include<stdio.h>
#define T int
#define MAXSIZE 20
#define MAXVALUE 0x7fffffff
typedef T SqList[MAXSIZE];
typedef struct SLNode
{
T data;
int link;
}SLNode;
typedef SLNode Table[MAXSIZE];
//#define USER_ZERO_SPACE
//交换函数
void Swap(T *a,T *b)
{
T tmp = *a;
*a = *b;
*b = tmp;
}
//直接插入排序---无哨兵位
void InsertSort(SqList &L,int n)
{
for(int i=1;i<n;++i)
{
if(L[i]<L[i-1])
{
Swap(&L[i],&L[i-1]);
for(int j=i-1;j>0&&L[j]<L[j-1];--j)
{
Swap(&L[j],&L[j-1]);
}
}
}
}
//直接插入排序----零号位置为哨兵位置
void InsertSort1(SqList &L,int n)
{
for(int i=2;i<n;i++)
{
if(L[i] < L[i-1])
{
L[0] = L[i];
L[i] = L[i-1];
int j;
for(j=i-2;L[0]<L[j];--j)
{
L[j+1] = L[j];
}
L[j+1] = L[0];
}
}
}
//折半插入排序
void BInsertSort(SqList &L,int n)
{
for(int i=2;i<n;++i) //默认第一个元素已经排序好
{
L[0] = L[i]; //零位置记录需要进行插入的元素
int low = 1;
int high = i-1;
while(low<=high) //查询适合元素插入的位置
{
int mid = (low+high)/2;
if(L[0]>=L[mid])
{
low = mid + 1;
}
else{
high = mid - 1;
}
} //即插入位置为high+1
for(int j=i;j>high+1;--j) //移动high+1之后的元素
{
L[j] = L[j-1];
}
L[high+1] = L[0]; //元素插入
}
}
//2-路插入排序
void TWayInsertSort(SqList &L,int n)
{
//printf("%d \n",n);
SqList TP;
TP[0] = L[0]; //头元素赋值
int head = 0;
int tail = 0;
for(int i=1;i<n;++i) //遍历插入TP数组
{
if(L[i]<TP[head]) //头插入
{
head = (head-1+n)%n;
TP[head] = L[i];
}
else if(L[i]>TP[tail])//尾插入
{
tail++;
TP[tail] = L[i];
}
else //中间插入
{
tail++;
TP[tail] = TP[tail-1];
int j=0;
for(j=tail-1;L[i]<TP[(j-1+n)%n];j=(j-1+n)%n)
{
// printf("%d^",j);
// printf("\n");
TP[j] = TP[(j-1+n)%n];
}
TP[j] = L[i];
}
}
for(int i=0;i<n;++i) //遍历赋值回L数组
{
L[i] = TP[head];
//printf("%d ",TP[head]);
head = (head+1)%n;
}
//printf("\n");
}
//表插入排序
void TableInsertSort(Table &t,int n)
{
t[0].link = 1;
int q,p;
for(int i=2;i<n;++i)
{
p = t[0].link;
q = 0;
while(p!=0&&t[p].data<=t[i].data)
{
q = p;
p = t[p].link;
}
t[i].link = t[q].link;
t[q].link = i;
}
}
int main()
{
SqList L = {0,49,38,65,97,76,13,27,49};
int n = 9;
Table tb;
tb[0].data = MAXVALUE;
tb[0].link = 0;
for(int i=1;i<n;++i)
{
tb[i].data = L[i];
tb[i].link = 0;
}
TableInsertSort(tb,n);
for(int i=0;i<n;++i)
{
if(tb[i].data == MAXVALUE)
printf(" * ");
else
printf("%.2d ",tb[i].data);
}
printf("\n");
for(int j=0;j<n;++j)
{
printf("%.2d ",tb[j].link);
}
printf("\n");
return 0;
}
/*
int main()
{
#ifdef USER_ZERO_SPACE
SqList L = {0,49,38,65,97,76,13,27,49};
int n = 9;
#else
SqList L = {49,38,65,97,76,13,27,49};
int n=8;
//InsertSort(L,n);
//for(int i=1;i<n;i++)
//{
// printf("%d ",L[i]);
//}
//InsertSort1(L,n);
//BInsertSort(L,n);
#endif // USER_ZERO_SPACE
TWayInsertSort(L,n);
#ifdef USER_ZERO_SPACE
for(int i=1;i<n;i++)
{
printf("%d ",L[i]);
}
#else
for(int i=0;i<n;i++)
{
printf("%d ",L[i]);
}
#endif
return 0;
}
*/