• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >C语言 > C++实现的归并排序算法详解

C++实现的归并排序算法详解

作者:难免有错_ 字体:[增加 减小] 来源:互联网 时间:2017-05-28

难免有错_ 通过本文主要向大家介绍了c++归并排序算法,归并排序c++,归并排序详解,归并排序算法,归并算法等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

本文实例讲述了C++实现的归并排序算法。分享给大家供大家参考,具体如下:

归并排序

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

归并过程

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

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

归并操作的工作原理

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

算法复杂度

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

算法C++代码

//合并两个序列
void mergeArray(int arr[], int first, int mid, int last, int temp[])
{
  int i = first;
  int j = mid + 1;
  int m = mid ;
  int n = last;
  int k = 0;
  while (i <= m && j<=n)
  {
    if (arr[i] <= arr[j])
      temp[k++] = arr[i++];
    else
      temp[k++] = arr[j++];
  }
  while (i <= m)
    temp[k++] = arr[i++];
  while (j <= n)
    temp[k++] = arr[j++];
  for (i = 0; i < k; i++)
    arr[first + i] = temp[i];
}
void mySort(int arr[], int first, int last, int temp[])
{
  if (first < last)
  {
    int mid = (first + last) / 2;
    mySort(arr, first, mid, temp);
    mySort(arr, mid+1, last, temp);
    mergeArray(arr, first, mid, last, temp);
  }
}
bool mergeSort(int arr[], int len)
{
  int*p = new int[len];
  if (NULL == p)
    return false;
  mySort(arr, 0, len - 1, p);
  delete[] p;
  return true;
}

</div>

算法测试

#include <iostream>
using namespace std;
//上述归并排序源码
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);
  mergeSort(arr, len);
  for (int i = 0; i < len; i++)
    cout << arr[i] << " ";
  cout << endl;
  system("pause");
}

</div>

运行结果:

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
请按任意键继续. . .

</div>

希望本文所述对大家C++程序设计有所帮助。

</div>
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • c++ 快速排序算法【过程图解】
  • C++实现的归并排序算法详解
  • 详细总结C++的排序算法
  • C++实现自顶向下的归并排序算法
  • C++归并算法实例
  • C++归并排序算法实例
  • C++中的几种排序算法

相关文章

  • 2017-05-28c++ #include是怎么样工作的?
  • 2017-05-28浅谈几种常见语言的命名空间(Namespace)
  • 2017-05-28浅析C++标准库元组(tuple)源码
  • 2017-05-28C++遍历文件夹获取文件列表
  • 2017-05-28深入C++ 函数映射的使用详解
  • 2017-05-28C语言实现统计字符串单词数
  • 2017-05-28基于排列与组合输出多少中情况详解
  • 2017-05-28利用C语言实现2048小游戏的方法
  • 2017-05-28函数指针的强制类型转换实现代码
  • 2017-05-28C++实现四叉树效果(附源码下载)

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • C/C++实现八大排序算法汇总
    • 归并排序的递归实现与非递归实现代码
    • C语言实现大数据文件的内存映射机制
    • 使用kendynet构建异步redis访问服务
    • 详解C++编程中运算符的使用
    • C++实现简单遗传算法
    • C语言中数组作为函数的参数以及返回值的使用简单入门
    • C++模板二段名字查找方法
    • C语言中的sscanf()函数使用详解
    • C语言实现xml构造解析器

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有