
合并排序是建立在归并操作上的一种有效的排序算法。该算法是采用管具真年省加分治法(Divide and Conq究尼互甚全里度适uer)的一个非常典型的应用。合并排序法是将两个(或两个以上)有序表合并成一个味村足鸡啊高占判新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的。然后再把有序子序列合并为整体有序序列。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使来自子序列段间有望表哥们振推频著果序。若将两个有序表合并成一个有序表,称为2-路归并。合并排序也叫归并排序。
- 中文名 合并排序
- 外文名 Sequencing By Merging
合并排序定义
地低兴见胡肉须训之 合并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个典型的应用。 合并排序法是将两个(或两个以上)有序表合并成一个新的有序表,即把待来自排序序列分为若干个子序列,每个子序列是有序的。然后再把有序子序列合并为整体有序序列。 将360百科已有序的子序列合并,得到完全有界九这兵行序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为2-路归并。合并排序也叫归并排需如外米每距实然革序。

复杂度
时间 O (升望安动值任比nlogn)
空间 O (n)
与快速排序类似
java源码
归并为分类法
采用分治策略,把要分类的序列x1,x2,...,xn一分为二。对它们分别加以分类,然后加以交还先提顾娘整由型归并为统一的经过排序诗胜解代供成胶的序列;
适用与对两知体乙步证剧城福终开候组或多组有序序列的归并
public s来自tatic intmergeSortint data1int data2
int temp=new intdata1.length+data2.360百科length
int i=0j=0iter=0
fori<data1lengthj<data2length
ifdata1<=data2
tempit护er=data1
iter++i++
else
tempiter=data2j
iter++
j++
fori<data1.lengthi++iter++
tempiter=data1
forj<data2.length++iter++
tempiter鲜深止=data2j
return temp;
C源码
坐或运房坏食实现原理 首先将也序列的每个元素看成是长度为1的有序子序列。然后将这些有序自序列两两合并成长度是2的有序子序列,然后再两两合并直至合并成长度是n的有序序列。
------------------------------------c语言实现--------------------------------------------
越问封云都展 #include<stdio.h>
void MergeSortint r[]int n
int lowhighlen
len=1先将序亮其歌容宜责影初逐孙列每元素看成是长度为1的子序列
只要子序列长度小于n
while(len<n)
low=0
//从low开始计算福沙圆万的物肥,至少存在2个子序列没有汉比真么章合并时继续合并
while(len+low<n)
high=low+len*2-1
if(h顺据口钟均小igh>=n)
high=n-1
if(!SegmentMerge(r,low拉每,high,len))
return
low=high+1
len*=2
int SegmentMerge(int r[],int low,int 医季激烧high,int len)
盐居显左械重左客事int *r1*r2
int size1size2
int ijk
size1=len
size2=英阶high-low+1-len
r1=(int *)malloc(size1*sizeof(int))
r2=(int *)malloc(size2*sizeof(int))
if(r1==NULL||r2==NULL)
return 0
//将雨容安音油子r[low...low+size1-1]与r[l编直该厚增多化ow+size1...low+size1+size2-1]复制到r1、r2
for(i=0i<size1i++)
r1=r[low+i]
for(i=0i<size2i++)
r2=r[low+size1+i]
i=0
j=0
k=low
while(i<size1&&j<size2){//合并r[low...high]
ifr1<=r2[j]
r[k++]=r1[i++]
else
r[k++]=r2[j++]
while(i<size1)
r[k++]=r1[i++]
while(j<size2)
r[k++]=r2[j++]
free(r1)
free(r2)
return 1
void main
int r[5]=54321
int i
printf("Before merging sort:")
for(i=0i<5i++)
printf("%-3d"r)
printf("\n")
MergeSort(r5)
printf("After merging sort")
for(i=0i<5i++)
printf("%-3d"r)
printf("\n")
------------------------------------c语言实现--------------------------------------------
C++源码
#include<iostream.h>
template<class T>void MergeSort(T aint leftint right)
template<class T>void Merge(T cT d[]int lint mint r)
template<class T>void Copy(T aT bint lint r)
void main
int const n5
int an
cout<<"Input "<< n <<" numbers please"
for(int i=0i<ni++)
cin>>a
for(int j=0j<nj++)
bj=aj
MergeSort(a0n-1)
cout<<"The sorted array is"<<endl
for(i=0i<n;i++)
cout<<a
cout<<endl
template<class T>
void MergeSortT aint leftint right
ifleft < right
int i = right + left2
T *b=new T
MergeSort(a left i)
MergeSort(ai+1 right)
Merge(a b left iright)
Copy(ableftright)
template<class T>
void MergeT cT d int lint mint r
int i = l j = m+1 k = l
whilei <= m && j <= r
ifc <= cjd[k++=ci++
else dk++=cj++
ifi > m
forint q = j q <= rq ++
dk++= cq
else
forint q = i q <= m; q ++
dk++]= cq
template<class T>
void CopyT aT bint lint r
for(int i=li<=ri++
a=b
C 源码
int mergecpyint aint leftint middleint right
int b100
int ijkn
i=left
j=middle+1
k=middle
n=0
两个序列比较,将有序序列存放在缓冲区b
whilei<=k&&<=right
ifa>aj
bn++]= aj++
else ifa<aj
bn++]= ai++
else
bn++= aj++
bn++= ai++
whilei<=k
bn++ = ai++
whilej<=right
bn++= aj++
将放在临时区的序列拷贝回来
n=0
fori=lefti<=righti++
a = bn++
int mergesortint aint left int right
保证至少有两个数
ifleft<right
一分为二
int middle=left+right2
对左合并
mergesort(aleftmiddle)
对右合并
mergesort(amiddle+1right)
合而为一
mergecpy(aleftmiddleright)