新闻资讯
看你所看,想你所想

合并排序

合并排序是建立在归并操作上的一种有效的排序算法。该算法是采用管具真年省加分治法(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

  tempiter=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)

转载请注明出处安可林文章网 » 合并排序

相关推荐

    声明:此文信息来源于网络,登载此文只为提供信息参考,并不用于任何商业目的。如有侵权,请及时联系我们:fendou3451@163.com