首先上代码。

  1. #include <iostream>
  2. using namespace std;
  3.  
  4. int arr[11];
  5. /*两个序列合并成一个序列。一共三个序列,所以用 3 根指针来处理。
  6. i 是 low 到 mid 这个序列下标 序列 1
  7. j 是 mid+1 到 high 这个序列下标 序列 2
  8. k 代表新序列的下表 序列 3
  9. */
  10. void merge(int a[], int low, int mid, int high)
  11. {
  12. int i = low, j = mid+1, k =low;
  13. int b[11];//这里直接开大一点。省事
  14.  
  15. /*把序列 1 和序列 2 里面小的元素先放进序列 3 */
  16. while(i <= mid && j <= high)
  17. if(a[i] <= a[j]) b[k++] = a[i++];
  18. else b[k++] = a[j++];
  19.  
  20. /*如果序列 2 的元素先消耗完,那就把序列 1 里面的所有元素放进序列 3*/
  21. while(i <= mid)
  22. b[k++] = a[i++];
  23. /*如果序列 1 的元素先消耗完,那就把序列 2 里面的所有元素放进序列 3*/
  24. while(j <= high)
  25. b[k++] = a[j++];
         /*把序列 3 赋值给原来的序列*/
  26. for(int i = low; i <= high; i++)
  27. a[i] = b[i];
  28.  
  29. }
  30.  
  31. void mergesort(int a[], int low, int high)
  32. {
  33. int mid;
  34. if(low < high)
  35. {
  36. mid = (low + high)/2;
  37. mergesort(a,low,mid);//递归划分序列
  38. mergesort(a,mid+1,high);
  39. merge(a,low,mid,high);
  40. }
  41. }
  42.  
  43. int main()
  44. {
  45.  
  46. for(int i = 1; i <= 10; i++)
  47. scanf("%d",&arr[i]);
  48. mergesort(arr,1,10);
  49. for(int i = 1; i <= 10; i++)
  50. cout<<arr[i]<<" ";
  51. cout<<"\n";
  52. return 0;
  53. }

分治法一般分为三个步骤。1.分 2.治 3.合并。归并排序也是分治的思想,所以它也可以分为三步。

1.分。将大序列划为两个小序列(当然也可以多个)。一直划分到序列只有 1 个元素的时候停止。

2.治。因为停止时候序列元素只有 1 个,所以治这一步是没有体现出来的。

3.合并。这是归并排序的主要步骤。合并是将两个序列合并为一个有序序列。具体怎么合并,可以参考merge函数注释。

分治法——归并排序(mergesort)的更多相关文章

  1. 排序算法THREE:归并排序MergeSort

    /** *归并排序思路:分治法思想 O(nlogn) * 把数组一分为二,二分为四 * 四和为二,二和为一 * */ /** * 归并排序主方法 *@params 待排序的数组 *@params 初始 ...

  2. 【LeetCode】分治法 divide and conquer (共17题)

    链接:https://leetcode.com/tag/divide-and-conquer/ [4]Median of Two Sorted Arrays [23]Merge k Sorted Li ...

  3. 分治法(一)(zt)

    这篇文章将讨论: 1) 分治策略的思想和理论 2) 几个分治策略的例子:合并排序,快速排序,折半查找,二叉遍历树及其相关特性. 说明:这几个例子在前面都写过了,这里又拿出来,从算法设计的策略的角度把它 ...

  4. 分治法求一个N个元素数组的逆序数

    背景  逆序数:也就是说,对于n个不同的元素,先规定各元素之间有一个标准次序(例如n个 不同的自然数,可规定从小到大为标准次序),于是在这n个元素的任一排列中,当某两个元素的先后次序与标准次序不同时, ...

  5. (逆序对 分治法)P1908 逆序对 洛谷

    题目描述 猫猫TOM和小老鼠JERRY最近又较量上了,但是毕竟都是成年人,他们已经不喜欢再玩那种你追我赶的游戏,现在他们喜欢玩统计.最近,TOM老猫查阅到一个人类称之为“逆序对”的东西,这东西是这样定 ...

  6. 分治法——快速排序(quicksort)

    先上代码 #include <iostream> using namespace std; int partition(int a[],int low, int high) { int p ...

  7. python 实现分治法的几个例子

    分治法所能解决的问题一般具有以下几个特征: 1) 该问题的规模缩小到一定的程度就可以容易地解决 2) 该问题可以分解为若干个规模较小的相同问题,即该问题具有最优子结构性质. 3) 利用该问题分解出的子 ...

  8. 分治法及其python实现例子

    在前面的排序算法学习中,归并排序和快速排序就是用的分治法,分治法作为三大算法之一的,有非常多的应用例子. 分治法概念 将一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题-- ...

  9. 算法笔记_065:分治法求逆序对(Java)

    目录 1 问题描述 2 解决方案 2.1 蛮力法 2.2 分治法(归并排序)   1 问题描述 给定一个随机数数组,求取这个数组中的逆序对总个数.要求时间效率尽可能高. 那么,何为逆序对? 引用自百度 ...

随机推荐

  1. vs2017离线安装且安装包不占用C盘空间

    [参考]vs2017离线安装且安装包不占用C盘空间 第一步:下载离线安装包 https://www.visualstudio.com/zh-hans/downloads/ 在官方地址下载vs_prof ...

  2. ThinkPHP 文件上传到阿里云OSS上(干货)

    参考:http://www.thinkphp.cn/extend/789.html 1.前往阿里云github下载SDK包:https://github.com/aliyun/aliyun-oss-p ...

  3. 查看MYSQL数据表锁定

    SHOW OPEN TABLES WHERE in_use>0; #查看锁定的表SHOW PROCESSLIST; #查看对应的进程ID 找到对应的进程ID,直接KILL就行了

  4. mac上制作ubuntu引导盘

    https://help.ubuntu.com/community/How%20to%20install%20Ubuntu%20on%20MacBook%20using%20USB%20Stick h ...

  5. PHP base64数据与图片的互相转换

    1.解析base64数据成图片 The problem is that data:image/bmp;base64, is included in the encoded contents. This ...

  6. jquery和ajax和springmvc

    <script type="text/javascript" src="js/jquery-1.11.1.js"></script> $ ...

  7. eclipse哪个版本好

    Eclipse IDE for Java EE Developers (企业级开发软件,干啥都足够了,300MB左右)

  8. NYOJ - 矩形嵌套(经典dp)

    矩形嵌套时间限制:3000 ms | 内存限制:65535 KB 描述 有n个矩形,每个矩形可以用a,b来描述,表示长和宽.矩形X(a,b)可以嵌套在矩形Y(c,d)中当且仅当a<c,b< ...

  9. elk-filebeat-(效果图示)(四)

    一.vim filebeat-6.3.2-linux-x86_64/filebeat.yml - type: log # Change to true to enable this input con ...

  10. 原生js的remove方法代表删除节点

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...