博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
数据结构与算法--归并排序
阅读量:5060 次
发布时间:2019-06-12

本文共 1524 字,大约阅读时间需要 5 分钟。

算法原理

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

算法实例

1019477-20170226150515523-449428018.png

如果数组A含有1、13、24、26,数组B含有2、15、27、38,那么该算法进行如下:
首先,比较在1和2之间进行,1被加到C中,然后13和2进行比较。
1019477-20170226150529695-798448652.png
2被添加到C中,然后13和15进行比较。
1019477-20170226150542616-514783890.png
13被添加到C中,接下来比较24和15,这样一直进行到26和27进行比较。
1019477-20170226150552195-1414953702.png
1019477-20170226150601429-828634613.png
1019477-20170226150611804-294598413.png
将26添加到C中,数组A已经用完。
1019477-20170226150621132-885289805.png
将数组B的其余部分拷贝到C中。
1019477-20170226150629070-518413533.png

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];}

转载于:https://www.cnblogs.com/y3w3l/p/6444678.html

你可能感兴趣的文章
FreeBSD方式安装 MAC OSX
查看>>
Linux 根文件系统制作
查看>>
IOS--沙盒机制
查看>>
My.Ioc 的性能
查看>>
使用 JointCode.Shuttle 访问任意 AppDomain 的服务
查看>>
hdoj 1846 Brave Game(巴什博弈)
查看>>
Round #345 B. Beautiful Paintings(Div.2)
查看>>
51nod 1018排序
查看>>
sqlite的坑
查看>>
digitalocean --- How To Install Apache Tomcat 8 on Ubuntu 16.04
查看>>
linux swoole
查看>>
An Easy Problem?! - POJ 2826(求面积)
查看>>
【题解】[P4178 Tree]
查看>>
Jquery ui widget开发
查看>>
css3实现循环执行动画,且动画每次都有延迟
查看>>
更改git仓库地址
查看>>
有标号DAG计数 [容斥原理 子集反演 组合数学 fft]
查看>>
Recipe 1.4. Reversing a String by Words or Characters
查看>>
Rule 1: Make Fewer HTTP Requests(Chapter 1 of High performance Web Sites)
查看>>
sql注入
查看>>