2017年计算机二级office操作题-2017年计算机二级C++辅导编程:用C++实现合并排序

副标题:2017年计算机二级C++辅导编程:用C++实现合并排序

时间:2023-08-20 05:52:01 阅读: 最新文章 文档下载
说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。


  用C++实现合并排序

  合并排序的思想:当只有一个元素时终止排序,超过一个元素的话,将所有元素分成大致相同的两个集合,分别对两个集合进行排序,最后将排好序的子集合合并为所要求的排好序的集合。

  在最坏情况下,时间复杂度为O(nlogn),它是一个渐进的算法。

  #include

  #include

  //这个函数将b[0]至b[right-left+1]拷贝到a[left]至a[right]

  template

  void Copy(T a[],T b[],int left,int right)

  {

  int size=right-left+1;

  for(int i=0;i

  {

  a[left++]=b[i];

  }

  }

  //这个函数合并有序数组a[left:i],a[i+1:right]到b,得到新的有序数组b

  template

  void Merge(T a[],T b[],int left,int i,int right)

  {

  int a1cout=left,//指向第一个数组开头

  a1end=i,//指向第一个数组结尾

  a2cout=i+1,//指向第二个数组开头

  a2end=right,//指向第二个数组结尾

  bcout=0;//指向b中的元素

  for(int j=0;j

  {

  if(a1cout>a1end){b[bcout++]=a[a2cout++];continue;}//如果第一个数组结束,拷贝第二个数组的元素到b

  if(a2cout>a2end){b[bcout++]=a[a1cout++];continue;}//如果第二个数组结束,拷贝第一个数组的元素到b

  if(a[a1cout]

  else

  {b[bcout++]=a[a2cout++];continue;}

  }

  }

  //对数组a[left:right]进行合并排序

  template

  void MergeSort(T a[],int left,int right)

  {

  T *b=new int[right-left+1];

  if(left

  int i=(left+right)/2;//取中点

  MergeSort(a,left,i);//左半边进行合并排序

  MergeSort(a,i+1,right);//右半边进行合并排序

  Merge(a,b,left,i,right);//左右合并到b中

  Copy(a,b,left,right);//从b拷贝回来

  }

  }

  //from

  int main()

  {

  int n;

  cout<<"how many numbers to sort:";

  cin>>n;

  int *a=new int[n];

  cout<<"input "<

  for(int i=0;i

  {cin>>a[i];}

  MergeSort( a, 0, n-1);

  for(int j=0;j

  {

  cout<

  }

  return 1;

  }

2017年计算机二级C++辅导编程:用C++实现合并排序.doc

本文来源:https://www.wddqw.com/SGvn.html