#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct node
{
int content;
int next;
}node;
typedef struct slinklist
{
int head;
int size;
node *nodes;
}slinklist;
slinklist *initializelist(int *source,int size)
{
slinklist *s=NULL;
int i=0;
//basic initialize
s=(slinklist *)malloc(sizeof(slinklist));
s->head=-1;
s->size=size;
s->nodes=(node *)malloc(sizeof(node)*size);
//add data
for(i=0;i<size;i++)
{
(s->nodes+i)->content=*(source+i);
(s->nodes+i)->next=-1;
}
s->head=0;
return s;
}
void insertsort(slinklist *s,int offset)
{
node *pointer=NULL;
int i=0;
int size=0;
size=s->size;
for(i=1;i<size;i++)
{
pointer=(s->nodes+s->head);//here,pointer always point to the head
if((s->nodes+s->head)->content>(s->nodes+i)->content)
{
(s->nodes+i)->next=s->head;
s->head=i;
}
else
{
if((s->nodes+s->head)->next==-1)
{
(s->nodes+s->head)->next=i;
}
else
{
while((s->nodes+pointer->next)->content<(s->nodes+i)->content)//pointer travel through list to find a positon for element i
{
if(pointer->next==-1)break;
pointer=(s->nodes+pointer->next);
}
if(pointer->next==-1)
pointer->next=i;
else
{
(s->nodes+i)->next=pointer->next;
pointer->next=i;
}
}
}
}
for(i=0;i<size;i++)
if((s->nodes+i)->next!=-1)(s->nodes+i)->next+=offset;
s->head+=offset;
}
int merge(slinklist *head,slinklist *ss1,slinklist *ss2)
{
int r=0;
node *n0=NULL,*n1=NULL,*n2=NULL;
int i=0,j=0,ii=-1,jj=-1,xnew=0;
n0=head->nodes;
n1=(head->nodes+ss1->head);
n2=(head->nodes+ss2->head);
if(n1->content>n2->content)
r=ss2->head;
else
r=ss1->head;
i=(ss1->head);
j=(ss2->head);
while(i!=-1&&j!=-1)
{
if((head->nodes+i)->content>(head->nodes+j)->content)
{
while((head->nodes+i)->content>(head->nodes+j)->content)
{
jj=j;
j=(head->nodes+j)->next;
if(j==-1)goto out;
}
xnew=(head->nodes+i)->next;
(head->nodes+i)->next=(head->nodes+jj)->next;
(head->nodes+jj)->next=i;
j=i;
i=xnew;
}
else
{
while((head->nodes+i)->content<=(head->nodes+j)->content)
{
ii=i;
i=(head->nodes+i)->next;
if(i==-1)goto out;
}
xnew=(head->nodes+j)->next;
(head->nodes+j)->next=(head->nodes+ii)->next;
(head->nodes+ii)->next=j;
i=j;
j=xnew;
}
}
out:
if(i==-1&&ii!=-1)
(head->nodes+ii)->next=j;
if(j==-1&&jj!=-1)
(head->nodes+jj)->next=i;
return r;
}
void mergesort(slinklist *s,slinklist *head,int offset)
{
slinklist *ss1,*ss2=NULL;
ss1=(slinklist *)malloc(sizeof(slinklist));
ss2=(slinklist *)malloc(sizeof(slinklist));
if(s->size<5)
{
insertsort(s,offset);
return;
}
else
{
ss1->nodes=s->nodes;
ss1->size=s->size/2;
ss1->head=0;
mergesort(ss1,head,offset);
ss2->nodes=s->nodes+s->size/2;
ss2->size=s->size-s->size/2;
ss2->head=0;
if(s->size/2!=0)mergesort(ss2,head,offset+s->size/2);
if(s->size/2!=0)s->head=merge(head,ss1,ss2);
else
s->head=ss1->head;
free(ss1);
free(ss2);
return;
}
}
main()
{
slinklist *s;
int source1[]={23,11,24,45,67,89,65,33,21,23,44,12,15,100,7,123,4,11,23};
s=initializelist(source1,19);
mergesort(s,s,0);
}
最后s中nodes域保存了排序后的静态链表
写的可能不够幽雅,但是通用性满好的。