归并排序:

归并操作,也叫归并算法,指的是将两个已经排序的序列合并成一个序列的操作。归并排序算法依赖归并操作。

归并操作的过程如下:
    (1) 申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列
    (2) 设定两个指针,最初位置分别为两个已经排序序列的起始位置
    (3) 比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置
    (4) 重复步骤3直到某一指针到达序列尾

(5) 将另一序列剩下的所有元素直接复制(抄)到合并序列尾

简单的说,就是将一个序列不断的进行二分(当然也可以三分、多分)分裂,然后递归下去,再合并。

源代码:

[cpp]  view plain copy
  1. /*=============================================================================
  2. #
  3. #     FileName: Merge_Sort.c
  4. #         Desc: 归并排序
  5. #
  6. #       Author: zhangyuqing
  7. #
  8. #      Created: 2014年6月29日23:18:16
  9. #      Version: 0.0.1
  10. #
  11. =============================================================================*/
  12. #include "stdafx.h"
  13. #include <stdlib.h>
  14. #include <malloc.h>
  15. //归并操作
  16. void merge(int src[], int des[], int low, int high ,int mid)
  17. {
  18. int i = low;
  19. int k = low;
  20. int j = mid + 1;
  21. while (( i <= mid ) && ( j <= high ))
  22. {
  23. if (src[i] < src[j])
  24. {
  25. des[k++] = src[i++];
  26. }
  27. else
  28. {
  29. des[k++] = src[j++];
  30. }
  31. }
  32. while (i <= mid)
  33. {
  34. des[k++] = src[i++];
  35. }
  36. while (j <= high)
  37. {
  38. des[k++] = src[j++];
  39. }
  40. }
  41. void MSort(int src[], int des[] ,int low, int high, int max_size)
  42. {
  43. int mid = (low + high) / 2;
  44. if (low == high)
  45. {
  46. des[low] = src[low];
  47. }
  48. else
  49. {
  50. int mid = (low + high) / 2;
  51. int * des_space = (int *)malloc(sizeof(int) * max_size);
  52. if (NULL != des_space)
  53. {
  54. MSort( src, des_space, low, mid, max_size);
  55. MSort( src, des_space, mid+1, high, max_size);
  56. merge( des_space, des, low, high, mid);
  57. }
  58. free(des_space);
  59. }
  60. }
  61. void Meger_Sort(int arr[], int low, int high, int len)
  62. {
  63. MSort( arr, arr, low, high, len);
  64. }
  65. int main(void)
  66. {
  67. int arr[10];
  68. for ( int i=0; i<10; i++)  //初始化数据
  69. {
  70. arr[i] = rand()%100;  //随机生成数据
  71. }
  72. printf("Before sort:\n");  //打印排序前的数据
  73. for (int i = 0; i < 10; i++)
  74. {
  75. printf("%d ",arr[i]);
  76. }
  77. //开始排序
  78. Meger_Sort( arr, 0, 10-1, 10);
  79. printf("\nAfter sort:\n"); //打印排序后的数据
  80. for (int i = 0; i < 10; i++)
  81. {
  82. printf("%d ",arr[i]);
  83. }
  84. system("pause");
  85. return 0;
  86. }

运行结果:

[cpp]  view plain copy
  1. Before sort:
  2. 41 67 34 0 69 24 78 58 62 64
  3. After sort:
  4. 0 24 34 41 58 62 64 67 69 78 请按任意键继续. . .

归并排序(C语言实现)相关推荐

  1. c语言mergesort 参数,归并排序C语言兑现MergeSort

    归并排序C语言实现MergeSort 是建立在归并操作上的一种有效的排序算法.该算法是采用分治法(Divide and Conquer)的一个非常典型的应用. 算法伪码: MERGE-SORT(A,p ...

  2. 归并排序(C语言简单实现)

    归并排序(C语言简单实现) 归并排序(Merging Sort)利用的就是归并的思想实现的排序方法.原理是:假设初始序列含有n个记录,则可以看成是n个有序的子序列,每个子序列的长度为1,然后两两归并, ...

  3. 归并排序 C语言实现

    1. 归并排序(排序的方法一种,速度比选择排序.插入排序等快很多)适合较多数据排序 2. 归并排序思想(拆分.合并) 2.1 拆分 2.2 合并 2.2 合并详解 3. c语言代码实现 #includ ...

  4. 分治——归并排序c语言

    概念: 归并排序(MERGE-SORT)是利用归并的思想实现的排序方法,该算法采用经典的分治(divide-and-conquer)策略(分治法将问题分(divide)成一些小的问题然后递归求解,而治 ...

  5. 归并排序的java语言_归并排序 java语言

    /* * 归并排序算法 */ public class MergeSort { final static int MAX=0x7FFFFFFF; public static void main(Str ...

  6. 排序算法之归并排序 ( C语言版 )

    归并排序 :(Merge Sort)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用.将已有序的子序列合并,得到完全有序的序列:即 ...

  7. 多线程归并排序C语言,快速排序 和 归并排序  c语言实现

    快速排序: 平均时间复杂度:O(n*lgn), 最坏 O(n*n),辅助空间 O(n*lgn),不稳定 归并排序: 平均时间复杂度:O(n*lgn), 最坏 O(n*lgn),辅助空间 O(n),稳定 ...

  8. 单链表的归并排序(C语言)

    //数据域val,指针域nextstruct ListNode{int val;struct ListNode* next; }; //创建单链表struct ListNode* CreatList( ...

  9. 二路归并排序c语言实现

    二路归并排序主要运用了"分治算法",分治算法就是将一个大的问题划分为n个规模较小而结构相似的子问题. 这些子问题解决的方法都是类似的,解决掉这些小的问题之后,归并子问题的结果,就得 ...

最新文章

  1. Mrtg搭建流量监控服务器
  2. selenium 页面经常改变元素_selenium 总结篇,常见方法和页面元素的操作
  3. Oracle基础中的基础视频讲座录像(西安)供免费下载
  4. WinCE的快速启动
  5. Python的第三方库fileType
  6. JAVA中数据的读取与写入,不同类型数据的转换
  7. HTTP协议详解 (转)
  8. double除以int结果是int吗_游戏开发java中int可以用汉字吗?
  9. 极光im支持android手机系统,极光IM- JMessage 产品简介 - 极光文档
  10. python开发网站实例-手把手教你写网站:Python WEB开发技术实战
  11. 如何阅读源码学习总结
  12. Lotus Symphony 正式版发布!
  13. 异地灾备,利用华为云就可以实现
  14. 你必须知道的3D建模流程,最后一步是关键
  15. LOJ#2833 「JOISC 2018 Day 1」帐篷 dp
  16. 加速linux开机速度 systemctl
  17. BERT-BiLSTM-CRF模型代码
  18. 内存碎片产生原因及处理
  19. 决策树(Decision Tree)算法原理总结(二)
  20. P4546 [THUWC2017]在美妙的数学王国中畅游

热门文章

  1. 修改mysql8.0中数据库的名字
  2. 详解主流浏览器多进程架构:Chrome、IE
  3. 后台管理系统-登录页面
  4. win10 的计算机配置要求,详细教你windows10的配置要求
  5. CryptoJS v3.1.2 源码自取
  6. idea 2018.2破解激活
  7. 中文拼音模糊查询的一种解决方法
  8. 智能镜——6.屏幕显示时间日期篇
  9. VR全景技术的优点有哪些?
  10. Python中的对象实例化过程 用python解密__new__