归并Sort

/************************************
--修改日期:	2009.5.29
--修改人:		吴强
--修改原因:	从前写的代码不够规范
--输入要求:	无
************************************/

#include 
#include 

#define N 20

main()
{
    int i;
    int iArr[N]={2, 5, 4, 3, 6, 11, 23, 42, 13, 16,
    		32, 12, 31, 52, 34, 25, 42, 34, 22,33 };
    
    void MergeSort(int iArr[]);
    void MergePass(int iArr[], int len);
    void Merge(int iArr[], int low, int m, int high);
    void MergeSortDC(int iArr[], int low, int high);

    // MergeSortDC(iArr, 0, N-1); 
    MergeSort(iArr);

    for (i= 0; i< N; i++)
    {
        printf("%d,",iArr[i]);
    }

    printf("/n");
}

//递归方法实现
void MergeSortDC(int iArr[], int low, int high)
{
    int m;

    /*顶和底下标相同则退出*/
    if (low< high)                    
    {
        m=(low+high-1)/2;

    	/*用递归从顶找到低,然后从低在归并会顶*/
    	MergeSortDC(iArr, low, m);              
    	MergeSortDC(iArr, m+1, high);
    	Merge(iArr, low, m, high);
    }
}

void Merge(int iArr[],int low ,int m,int high)     
{
    int i=low;
    int j=m+1;
    int k=0;
    int *p;     /*利用一空间记录排序好的俩文件,最后付给iArr */

    p=(int *)malloc( (high-low+1)*sizeof(int) );

    if (!p)
    {
    	printf("error");
        exit(0);
    }

	/*俩个文件比较排序*/
    while (i<= m && j<= high)     
    {
    	p[k++]=iArr[i]< iArr[j]? iArr[i++]:iArr[j++];
    }

    while (i<= m)
    {
        p[k++]=iArr[i++];
    }

    while (j<=high)
    {
        p[k++]=iArr[j++];
    }

	/*排序好的P付给iArr*/
    for (i=low,k=0; i<= high; i++,k++)       
    {
        iArr[i]=p[k];
    }
   
}


//非递归方法实现
/*2路归并-自底向上 算法*/
void MergeSort(int iArr[])
{
    int i;

    /*i为数据归并的长度*/
    for (i=1; i< N; i*=2)          
    {
        MergePass(iArr, i);
    }
}

void MergePass(int iArr[], int len)
{
    int i;

    for (i=0; i+2*len-1< N; i+=2*len) 
    {
    	/*归并|i、i+len-1为第一有序文件头,尾下标*/
        Merge(iArr, i, i+len-1, i+2*len-1);     
    }

    /*如果存在俩个长度不足够的,就归并他们*/
    if (i+len-1< N)                    
    {
    	/*n-1为最后一个元素下标*/
        Merge(iArr, i, i+len-1, N-1);       
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值