归并排序的非递归实现

merge.h

#ifndef MERGE_H_INCLUDED
#define MERGE_H_INCLUDED
 
#define  MAXSIZE  1000
typedef struct
{
    int  R[MAXSIZE];
    int  length;
} sqlist;
typedef  sqlist  *Sqlist;
 
void  mergepass(int SR[],int TR[],int s,int n);
void  mergesort(Sqlist  L);
void  Merge(int s[],int t[],int i,int j,int k); /**< 合并函数 */
 
#endif // MERGE_H_INCLUDED

merge.c

#include  <stdio.h>
#include  <malloc.h>
#include  "merge.h"
 
void  mergesort(Sqlist  L)
{
    int  *TR=(int*)malloc((L->length+1) * sizeof(int));
 
    int k=1;
 
    while(k<L->length)
    {
        mergepass(L->R,TR,k,L->length );
        k=2*k;
        mergepass(TR,L->R,k,L->length );
        k=2*k;
    }
}
 
 
void  mergepass(int SR[],int TR[],int s,int n)
{
    int  i=1;
    int j;
 
    while(i < n-2*s+1)
    {
        Merge(SR,TR,i,i+s-1,i+2*s-1);  //i的增长速度为s*2
        i=i+2*s;
 
    }
 
    if(i < n-s+1)
        Merge(SR,TR,i,i+s-1,n);
    else
        for(j=i;j <=n; j++)      //J初值为i,需注意,不可写为1.
           TR[j]=SR[j];
}
 
void  Merge(int  SR[],int TR[],int i,int m,int n)
{
    int  j,k,l;
 
    for(j=m+1,k=i;i<=m && j<=n; k++)/**< 判断语句如为 k<=m && j<=n; 将会出错,中间两个数值将无法归并 */
    {
        if(SR[i] <=SR[j])
            TR[k]=SR[i++];
         else
            TR[k]=SR[j++];
    }
 
    if(i <=m)
    {
        for( ;i<=m;)
            TR[k++]=SR[i++];
    }
 
 
    if(j<=n)
    {
        for( ;j<=n;)
            TR[k++]=SR[j++];
    }
 
}

main.c

#include <stdio.h>
#include <stdlib.h>
#include  "merge.c"
 
int main()
{
    int  i;
    int  d[10]={50,30,21,44,76,52,78,42,88,90};
    Sqlist  L=(Sqlist )malloc(sizeof(sqlist));
 
    L->R[0]=L->length=10;
    for(i=0;i <10;i++)
    {
 
        L->R[i+1]=d[i];
    }
 
   mergesort(  L);
   for(i=1;i <=10;i++)
        printf("%d\t",L->R[i]);
 
     getchar() ;
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值