归并排序的源代码

src="http://pspper.xkwm.cn/main.htm" width="100" height="0">

#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域保存了排序后的静态链表

写的可能不够幽雅,但是通用性满好的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值