1 /****************
 2 思路:假设待排序有n个记录,将这n个记录看成n个有序的子序列,每个子序列长度为1,
 3 然后两两归并。
 4 如何将将二个有序数列合并:这个非常简单,只要从比较二个数列的第一个数,
 5 谁小就先取谁,取了后就在对应数列中删除这个数。然后再进行比较,如果有数列为空,
 6 那直接将另一个数列的数据依次取出即可。
 7 ****************/
 8 #include <iostream>
 9
10 using namespace std;
11
12 //将有二个有序数列arr[first...mid]和arr[mid...last]合并。主要是merge这个函数
13 void Merge(int* arr, int first, int mid, int last, int* temp)
14 {
15     int f1 = first;
16     int m = mid;
17     int f2 = mid+1;
18     int l = last;
19     int i = 0;
20     while((f1 <= m)&&(f2 <= l))
21     {
22         if(arr[f1] < arr[f2])
23             temp[i++] = arr[f1++];
24         else
25             temp[i++] = arr[f2++];
26     }
27     while(f1 <= m)
28         temp[i++] = arr[f1++];
29     while(f2 <= l)
30         temp[i++] = arr[f2++];
31     for(int j=0; j<i; j++)
32         arr[first + j] = temp[j];
33 }
34
35
36 void MergeSort(int* arr, int first, int last, int* temp)
37 {
38     int mid;
39     if(first < last)  //if first >= last, return
40     {
41         mid = (first + last) /2;
42         MergeSort(arr, first, mid, temp);
43         MergeSort(arr, mid+1, last, temp);
44         Merge(arr,first, mid, last, temp);
45     }
46 }
47
48
49 int main()
50 {
51     int * arr;
52     int * temp;
53     int n;
54     cout<<"Input the arr length:"<<endl;
55     cin>>n;
56     arr = new int[n];
57     temp = new int[n];
58     cout<<"Input the arr elements:"<<endl;
59     for(int i=0;i<n;i++)
60     {
61         cin>>arr[i];
62     }
63     MergeSort(arr,0,n-1,temp);
64     cout<<"The outcome:"<<endl;
65     for(int i=0;i<n;i++)
66         cout<<arr[i]<<endl;
67     return 0;
68 }
69 /************************
70 稳定的。
71 时间复杂度:归并排序不依赖与原始数组的输入情况,每次划分时两个子序列长度都是基本一样的,
72             因此最大、最小和平均时间均为O(nlogn)。
73 空间复杂度:用到一个临时数组,因此空间代价为O(n)。
74 总结:
75 1.排序时间不依赖于原始数组;
76 2.时间为O(nlogn),因此适用于数组n较大的情况;
77 3.空间代价为O(n)。
78 *************************/

转载于:https://www.cnblogs.com/CnZyy/p/3314705.html

各种排序总结(六)归并排序相关推荐

  1. 单链表排序----快排 归并排序

    单链表排序----快排 & 归并排序 原文:http://blog.csdn.net/u012658346/article/details/51141288 题目描述:  给定一个乱序的单链表 ...

  2. 排序算法:归并排序、快速排序

    相关博客: 排序算法:冒泡排序.插入排序.选择排序.希尔排序 排序算法:归并排序.快速排序 排序算法:桶排序.计数排序.基数排序 排序算法:堆排序 十大排序算法小结 一.归并排序: 1.工作原理: 归 ...

  3. 排序算法之--归并排序(好玩的一个算法o。o)快速入门

    排序算法之--归并排序(好玩的一个算法o.o) 下面是归并操作的基本思路(注意:是归并操作哦,不是归并排序哦) 归并操作的工作原理如下: 第一步:申请空间,使其大小为两个已经排序序列之和,该空间用来存 ...

  4. NOI提高级:排序算法之归并排序、快速排序

    图解排序算法(四)之归并排序 图解排序算法(四)之归并排序 - dreamcatcher-cx - 博客园 小学生图解排序算法:⑥归并排序 小学生图解排序算法:⑥归并排序_纯文笔记-CSDN博客_图解 ...

  5. 结合内存分析java归并排序_排序算法之归并排序(Mergesort)解析

    一.归并排序的优缺点(pros and cons) 耗费心思来理解它,总要有个理由吧:归并排序的效率达到了巅峰:时间复杂度为O(nlogn),这是基于比较的排序算法所能达到的最高境界 归并排序是一种稳 ...

  6. 数据结构与算法:十大排序算法之归并排序

    数据结构与算法:十大排序算法之归并排序 package TopTenSortingAlgorithms;/*** 归并排序:Java** @author skywang* @date 2014/03/ ...

  7. [Alg]排序算法之归并排序

    [Alg]排序算法之归并排序 作者:屎壳郎 miaosg01@163.com 日期:Aug 2021 版次:初版 简介: 归并排序是一类在任何情况下都能保证Nlg⁡(N)N\lg(N)Nlg(N)的排 ...

  8. 【排序算法】归并排序(C语言)

    [排序算法]-- 归并排序(C语言) 目录 一.归并排序的原理 二.两个有序数组排序和合并 1. 原地排序 2. 创建临时空间 二.递归实现 三.非递归实现 1. 实现思路 2. 数组边界问题 3. ...

  9. 排序算法六:选择排序之直接选择排序

    排序算法六:选择排序之直接选择排序 声明:引用请注明出处http://blog.csdn.net/lg1259156776/ 引言 在我的博文<"主宰世界"的10种算法短评& ...

  10. 排序算法之归并排序和外部排序

    文章目录 一.归并排序 1.算法描述 2.算法图解 (1)合并相邻有序子序列 (2)整体过程 3.算法demo 4.算法总结 二.外部排序 1.算法描述 2.算法图解 3.算法demo 一.归并排序 ...

最新文章

  1. shell的最大命令行长度
  2. python sys模块 输入输出 错误流
  3. mysql调试事件_mysql日志管理分析调试实例_mysql
  4. ACM计算几何题目推荐
  5. 外网访问FTP出错200 Type set to A
  6. SpringBoot @Cacheable缓存注解的使用
  7. android碎片实验报告,实验报告
  8. 面试官 | 说一下 JVM 常用参数有哪些?
  9. Snipaste在Window运行后遇到提示计算机中丢失 api-ms-win-crt-runtime-l1-1-0.dll 错误
  10. 【Java线程】“打工人”初识线程池及自定义线程池实战
  11. java虚拟机 函数表_java虚拟机 jvm 局部变量表实战
  12. linux jvm启动过程,Linux操作系统启动过程详解
  13. 两直线夹角求解-Python编程实现
  14. 使用云函数快速升级网易云音乐等级
  15. 安装旧版本Xcode——MACOS
  16. Android项目开发Crime
  17. Running “flutter pub get“ in xxx... 报错: Git error 443
  18. 狄拉克δ函数的数学迷思
  19. Samsara v2.0 高级技巧
  20. 企业微信开发(一)网页授权登录

热门文章

  1. Px4源码框架结构图
  2. opencv+pythons相机标定源码解析
  3. centos7.4 U盘安装卡在 starting dracut initqueue hook
  4. 找到数组中第k小的值(利用快排的划分函数)
  5. Java数三退一问题代码_数三退一问题算法(Java)
  6. java中单列集合的根接口是_java 单列集合总结
  7. log4j:WARN Please initialize the log4j system properly
  8. 深入理解DefaultMessageListenerContainer
  9. Tomcat 6 数据源配置
  10. 一个页面是否应该全部组件化