zoukankan      html  css  js  c++  java
  • 数据结构与算法--归并排序

    算法原理

    归并排序基本操作是合并两个已经排序的表。基本的合并算法是取两个输入数组A和B,一个输出数组C,以及三个计数器Aptr,Bptr,Cptr,它们初始化对应数组的开始端。A[Aptr]和B[Bptr]中的较少者被拷贝到C中的下一个位置,相关的计数器向前推进一步。当两个输入表有一个用完时,则将另一个表中剩余部分拷贝到C中。
    

    算法实例


    如果数组A含有1、13、24、26,数组B含有2、15、27、38,那么该算法进行如下:
    首先,比较在1和2之间进行,1被加到C中,然后13和2进行比较。

    2被添加到C中,然后13和15进行比较。

    13被添加到C中,接下来比较24和15,这样一直进行到26和27进行比较。



    将26添加到C中,数组A已经用完。

    将数组B的其余部分拷贝到C中。

    C语言实现

    void Msort(ElementType A[],ElementType TmpArray[],
    			int Left,int Right)
    {
    	int Center;
    	if(Left < Right)
    	{
    		Center = (Left + Right) / 2;
    		Msort(A,TmpArray,Left,Center);
    		Msort(A,TmpArray,Center+1,Right);
    		Merge(A,TmpArray,Left,Center+1,Right);
    	}
    }
    void Mergesort(ElementType A[],int N)
    {
    	ElementType *TmpArray;
    	TmpArray = malloc(N * sizeof(ElementType));
    	if(TmpArray != NULL)
    	{
    		Msort(A,TmpArray,0,N-1);
    		free(TmpArray);
    	}
    	else
    		FataError("No space for tmp array!!");
    }
    void Merge(ElementType A[],ElementType TmpArray[],
    			int Lops,int Roos,int RightEnd)
    {
    	int i,LeftEnd,NumElements,TmpPos;
    	LeftEnd = Rpos - 1;
    	NumElements = RightEnd - Lpos + 1;
    	while(Lpos <= LeftEnd && Rpos <= RightEnd)
    		if(A[Lpos] <= A[Rpos])
    			TmpArray[TmpPos++] = A[Lpos++];
    		else
    			TmpArray[TmpPos++] = A[Rpos++];
    	while(Lpos <= LeftEnd)
    		TmpArray[TmpPos++] = A[Lpos++];
    	while(Rpos <= RighrEnd)
    		TmpArray[TmpPos++] = A[Rpos++];
    	for(i = 0;i < NumElements;i++,RightEnd--)
    		A[RightEnd] = TmpArray[RightEnd];
    }
  • 相关阅读:
    AtCoder ABC 129F Takahashi's Basics in Education and Learning
    AtCoder ABC 129E Sum Equals Xor
    UVA 511 Do You Know the Way to San Jose?
    UVA 12504 Updating a Dictionary
    [Poi2000] 病毒
    [loj10061] 最短母串
    [Poi2010] Antisymmetry
    校内集训20181003
    校内集训20181001
    校内集训20180925
  • 原文地址:https://www.cnblogs.com/y3w3l/p/6444678.html
Copyright © 2011-2022 走看看