插入排序就类似摸牌理牌的过程。每摸一个数,将其插入前面已排好的序列中。用数组实现即可。
下面我写出主要代码:
for(i=2;i<=N;i++) //这里我不用数组零空间,用来插的数据,插完第二个接着插第三个
{ //第一个数本来就有序,所以不用插了
key=a[i]; //把要插的数先保存起来,因为待会儿你插在前面时,元素要后移,会将其覆盖
for(j=i-1;j>0;j--) //你插第i个元素,说明前1到i-1个元素都排好了。
{
if(key>a[j]) //从有序序列中最后的元素比较,这里我用从小到大排序
{ //上面说明插入位置应该是第j+1个。
for(k=i-1;k>=j-1;k--) //后移操作。
a[k+1]=a[k];
}
a[j+1]=key; //插入
}
上面是基本思想,更标准的代码,你可以百度查查。
void insertsort(sqlist r,int n) //排序元素 r[1]~r[n]
{
int j,j;
for(i=2'i<=n;i++)
{
r[0]=r[i]; //r[0]是监视哨
j=i-1;
while(r[0].key
r[j+1]=r[j];
j++;
}
r[j+1]=r[0]; //在j+1位置处插入r[0]
}
}
这是直接插入排序的算法,纯手打,可以在VC上复制粘贴的
Node * Link_sort(Node * head)
{
Node * s=new Node;
Node *a=s;
s->next=head;
Node *p=head->next;
head->next=NULL;
while(p!=NULL)
{
Node *p1=p->next;
Node *p2=s->next;
while(p2!=NULL)
{
if(p->data<=p2->data)
{
s->next=p;
p->next=p2;
break;
}
if(p2->next==NULL)
{
p2->next=p;
p->next=p2;
break;
}
s=s->next;
p2=s->next;
}
p=p1;
s=a;
}
return a->next;
}
这里我定义的节点类为Node
class Node
{
public:
int data;
Node *next;
Node()
{
next=NULL;
}
}