如何使用c++实现归并排序算法

  介绍

这篇文章主要介绍如何使用c++实现归并排序算法,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!

具体如下:

<强>归并排序

归并排序(合并排序)是建立在归并操作上的一种有效的排序算法。
该算法是采用分治法(分治法)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列。
即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。

<强>归并过程

1,比较一个[我]和[j]的大小,若[我]≤[j],则将第一个有序表中的元素一个[我]复制到临时[k]中,并令我和k分别加上1;
2,否则将第二个有序表中的元素一个[j]复制到临时[k]中,并令j和k分别加上1。
3,如此循环下去,直到其中一个有序表取完,然后再将另一个有序表中剩余的元素复制到r中从下标k到下标t的单元。

归并排序的算法我们通常用递归实现,先把待排序区间(第一,去年)以中点二分,接着把左边子区间排序,再把右边子区间排序,最后把左区间和右区间用一次归并操作合并成有序的区间[第一,去年].

<强>归并操作的工作原理

第一步:申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列
第二步:设定两个指针,最初位置分别为两个已经排序序列的起始位置
第三步:比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置
重复步骤3直到某一指针超出序列尾,将另一序列剩下的所有元素直接复制到合并序列尾。

<强>算法复杂度

时间复杂度为O (nlogn)这是该算法中最好,最坏和平均的时间性能。
空间复杂度为O (n)
比较操作的次数介于(nlogn)/2和nlogn - n + 1。
赋值操作的次数是(2 nlogn)。
归并排序比较占用内存,但却是一种效率高且稳定的算法。

<强>算法c++代码

//合并两个序列   void  mergeArray (int  arr [], int 首先,int 中期,,int 最后,int 临时[])   {   int 才能;小姐:=,第一;   int 才能;j =, mid  +, 1;   int 才能;m =, mid ;   int 才能;n =,最后;   int 才能;k =, 0;   while 才能;(=小姐:& lt; m ,,, j<=n)   {才能   ,,,if  (arr[我],& lt;=, arr [j])   ,,,,,临时(k + +),=, arr (+ +);   ,,,   ,,,,,临时(k + +),=, arr [j + +);   ,,}   while 才能;(=小姐:& lt;米)   ,,,临时(k + +),=, arr (+ +);   while 才能;(j  & lt;=, n)   ,,,临时(k + +),=, arr [j + +);   for 才能;(小姐:=,0;,小姐:& lt;, k;,我+ +)   ,,,arr [first  +,我],=,临时[我];   }   void  mySort (int  arr [], int 首先,int 最后,int 临时[])   {   if 才能;(first  & lt;,最后)   {才能   ,,,int  mid =,(时间+ first 最后),/,2;   ,,,mySort(加勒比海盗,,,,,中期,临时);   ,,,mySort(加勒比海盗,中期+ 1,,,,临时);   ,,,mergeArray(加勒比海盗,,,,,中期,最后,临时);   ,,}   }   bool 归并排序(int  arr [], int 兰)   {   int * p 才能=,new  int (len);   if 才能;(NULL ==, p)   ,,,return 假;   mySort才能(加勒比海盗,0,,len 作用;1,p);   删除才能[],p;   return 才能;真实;   }

<>强算法测试

# include  & lt; iostream>   using  namespace 性传播疾病;//上述归并排序源码   int  main ()   {   int 才能arr[],=,{, 2, 23岁,32岁,34岁,45岁,6日,5日,65年,7日,6日,87年,87年,8日,798年,34岁,35岁,46岁,45岁,65年,756年,876年,8日,7日,87年,87年,5日,34岁,344年,,3,,32,};   int 才能;len =, sizeof (arr),/, sizeof (int);   归并排序才能(加勒比海盗,len);   for 才能;(int 小姐:=,0;,小姐:& lt;, len;,我+ +)   ,,,cout  & lt; & lt;, arr[我],& lt; & lt;,,,,,   cout 才能;& lt; & lt;, endl;   系统才能(“pause");   }

运行结果:

2, 3, 5, 5, 6, 6, 7, 7, 8, 8日,23日,32,32岁,34岁,34岁,34岁,35岁,45岁,45岁,46,65,65,87,87,87,87,344,756,798,876   请按任意键继续只只。

以上是“如何使用c++实现归并排序算法”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注行业资讯频道!

如何使用c++实现归并排序算法