//思想:将数组分为有序和无序两部分
//有序:a[0]
//无序:a[1]~a[n-1]
//遍历无序区间的所有元素,每次取出无序区间的第一个元素,a[i]
//和有序区间的元素进行比较,将a[i]插入到有序区间的合适位置
#include<bits/stdc++.h>
#define N 8
void InsertSort(int a[])
{
int i,j,x;
for(i=1;i<N;i++){
x=a[i];//x存取无序首元素值
for(j=i-1;j>=0&&a[j]>x;a[j+1]=a[j],j--);//对有序进行插入排序
a[j+1]=x;//数组元素移动完后要将小的元素赋值,实现插入
}
}
int main()
{
int a[N];
int i;
for(i=0;i<N;i++){//输入数组元素
scanf("%d",&a[i]);
}
InsertSort(a);//插入排序
for(i=0;i<N;i++){//输出
printf("%4d",a[i]);
}
return 0;
}
//链表实现插入排序
//思想与数组类似,不过用链表来表示
#include<bits/stdc++.h>
#define N 8
typedef struct node{
int data;
struct node *next;
}ElemSN;
ElemSN *Createlink(int a[])
{
ElemSN *head=NULL,*tail;
for(int i=N-1;i>=0;i--){//逆向建链
tail=(ElemSN *)malloc(sizeof(ElemSN));
tail->data=a[i];
tail->next=head;
head=tail;
}
return head;
}
ElemSN *InsertSortLink(ElemSN *head)
{
ElemSN *ho,*p,*q=NULL,*m;
ho=head->next;
head->next=NULL;
while(ho){
m=ho;//指向无序链表首结点
ho=ho->next;//无序链表头指针后移
m->next=NULL;//将待插元素从无序链断开
for(p=head;p&&p->data<m->data;q=p,p=p->next);//找到合适的待插位置
if(p==head){//头插
m->next=head;
head=m;
}
else{//中间尾插
m->next=q->next;
q->next=m;
}
}
return head;
}
void PrintLink(ElemSN *head)
{
if(head){//递归输出排好序的链表
printf("%d",head->data);
if(head->next){
printf("->");
}
PrintLink(head->next);
}
}
int main()
{
int a[N];
int i;
for(i=0;i<N;i++){//输入数组元素
scanf("%d",&a[i]);
}
ElemSN *head=NULL;
head=Createlink(a);//创建链表
head=InsertSortLink(head);//插入排序
PrintLink(head);//输出链表
return 0;
}