1.4插入排序-表插入排序
一.评估
稳定的排序算法
时间复杂度O(n^2)
移动次数 最大值 3(n-1)
二.思想
逐一插入,由尾向前逐一比较。
利用“指针”指示重排。
void List_InsertSort(struct list *r)
{
int i,p,q;
for(i = 2;i <= N;i ++)
{
q = 0;
p = r[0].next;
while(r[i].data > r[p].data)
{
q = p;
p = r[p].next;
}
r[q].next = i;
r[i].next = p;
}
}
void arrange(struct list *r)
{
int i,p,q;
struct list temp;
p = r[0].next;
for(i = 1; i <= N; i ++)
{
while(p < i)
{
p = r[p].next;
}
q = r[p].next;
if(i != p)
{
temp = r[p];
r[p] = r[i];
r[i] = temp;
r[i].next = p;
}
p = q;
}
}
三.示例
/* List Insertion Sort*/
//Copyright @wangnwei14309 All rights reserved
# include <stdio.h>
# define maxsize 51
# define maxint 32767
struct list
{
int data;
int next;
}a[maxsize];
void creat(struct list *r);
void List_InsertSort(struct list *r);//修改next域形成有序的循环链表
void arrange(struct list *r);//根据next域信息调整表结构,使数据升序排列
void print(struct list *r);
int N;
int main()
{
printf("/* the max input size is 50 */\n");
creat(a);
List_InsertSort(a);
arrange(a);
print(a);
}
void creat(struct list *r)
{
int i;
printf("sort how many numbers :");
scanf("%d",&N);
while(N >= maxsize || N<=0)//异常输入处理
{
printf("your inupt illegle,please try again :");
scanf("%d",&N);
}
printf("input %d numbers :",N);
for(i = 1;i <= N;i ++)
{
scanf("%d",&r[i].data);//data
r[i].next = 0;//next
}
r[0].data = maxint;
r[0].next = 1;
}
void List_InsertSort(struct list *r)
{
int i,p,q;
for(i = 2;i <= N;i ++)
{
q = 0;
p = r[0].next;
while(r[i].data > r[p].data)
{
q = p;
p = r[p].next;
}
r[q].next = i;
r[i].next = p;
}
}
void arrange(struct list *r)
{
int i,p,q;
struct list temp;
p = r[0].next;
for(i = 1; i <= N; i ++)
{
while(p < i)
{
p = r[p].next;
}
q = r[p].next;
if(i != p)
{
temp = r[p];
r[p] = r[i];
r[i] = temp;
r[i].next = p;
}
p = q;
}
}
void print(struct list *r)
{
int i;
printf("the result is :");
for(i = 1;i <= N;i ++)
printf("%d ",r[i].data);
printf("\n");
}