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

归并算法核心步骤为 :

  • 分解
  • 合并

图片来源  ---  https://baike.sogou.com/v8340582.htm?fromTitle=%E5%BD%92%E5%B9%B6%E6%8E%92%E5%BA%8F

  • 由于归并排序不依赖于待排序元素序列的初始输入状态, 每次划分时两个子序列的长度基本一致, 因此归并排序的最好, 最差好平均时间复杂度均为O(n*log2^n) , 是一种稳定的排序算法
  • 归并排序的优化,使用插入排序处理小规模的子数组,一般可以将归并排序的运行时间缩短10%~15%

代码实现如下 :

//分组归并
void _Merge(int *a, int begin1, int end1, int begin2, int end2, int *tmp)
{int index = begin1;int i = begin1, j = begin2;//注意:当划分的区间足够小时,begin1==end1,begin2==end2while (i <= end1&&j <= end2){if (a[i]<=a[j])tmp[index++] = a[i++];elsetmp[index++] = a[j++];}//将左边元素填充到tmp中while (i <= end1)tmp[index++] = a[i++];//将右边元素填充的tmp中while (j <= end2)tmp[index++] = a[j++];//将tmp中的数据拷贝到原数组对应的序列区间//注意:end2-begin1+1memcpy(a + begin1, tmp + begin1, sizeof(int)*(end2 - begin1 + 1));
}
//归并排序
void MergeSort(int *a, int left, int right, int *tmp)
{if (left >= right)return;assert(a);//mid将数组二分int mid = left + ((right - left) >> 1);//左边归并排序,使得左子序列有序MergeSort(a, left, mid, tmp);//右边归并排序,使得右子序列有序MergeSort(a, mid + 1, right, tmp);//将两个有序子数组合并_Merge(a, left, mid, mid + 1, right, tmp);
}

完整代码 :

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <string.h>//分组归并
void _Merge(int *a, int begin1, int end1, int begin2, int end2, int *tmp)
{int index = begin1;int i = begin1, j = begin2;//注意:当划分的区间足够小时,begin1==end1,begin2==end2while (i <= end1&&j <= end2){if (a[i]<=a[j])tmp[index++] = a[i++];elsetmp[index++] = a[j++];}//将左边元素填充到tmp中while (i <= end1)tmp[index++] = a[i++];//将右边元素填充的tmp中while (j <= end2)tmp[index++] = a[j++];//将tmp中的数据拷贝到原数组对应的序列区间//注意:end2-begin1+1memcpy(a + begin1, tmp + begin1, sizeof(int)*(end2 - begin1 + 1));
}
//归并排序
void MergeSort(int *a, int left, int right, int *tmp)
{if (left >= right)return;assert(a);//mid将数组二分int mid = left + ((right - left) >> 1);//左边归并排序,使得左子序列有序MergeSort(a, left, mid, tmp);//右边归并排序,使得右子序列有序MergeSort(a, mid + 1, right, tmp);//将两个有序子数组合并_Merge(a, left, mid, mid + 1, right, tmp);
}
//打印数组
void PrintArray(int *a, int len)
{assert(a);for (int i = 0; i < len; i++)printf("%d ", a[i]);printf("\n");
}
int main()
{int a[] = { 10, 6, 7, 1, 3, 9, 4, 2 };int *tmp = (int *)malloc(sizeof(int)*(sizeof(a) / sizeof(int)));memset(tmp, -1, sizeof(a) / sizeof(int));MergeSort(a, 0, sizeof(a) / sizeof(int)-1, tmp);PrintArray(a, sizeof(a) / sizeof(int));system("pause");return 0;
}

调试结果如下 :

排序算法之归并排序 ( C语言版 )相关推荐

  1. 经典排序算法之基数排序(C语言版)

    排序算法之基数排序的C语言实现. #include "math.h" #include "stdio.h"/* * 基数排序 2016-04-18 23:43: ...

  2. 常用排序算法总结(C语言版)

    文章目录 一.排序算法概览 二.算法实现 1.选择排序 2.冒泡排序 3.插入排序 4.快速排序 5.希尔排序 6.桶排序(基数排序) 7.归并排序 8.堆排序 三.总结 一.排序算法概览 可以在Vi ...

  3. 排序算法-堆排序(C语言版)

    堆排序是一种基于完全二叉树结构的一种排序算法,其整体思想很简单,就是构建完全二叉树,但是这里需要引入堆的概念.如下 大顶堆:每个结点的值都大于或等于其左右孩子结点的值 小顶堆:每个结点的值都小于或等于 ...

  4. 排序算法模板(C语言版)

    1.快速排序 //By LYLtimvoid swap(int *a, int *b) {int t = *a;*a = *b;*b = t; }void QSort(int l, int r) {i ...

  5. 排序算法之——归并排序 C语言实现

    一 .归并排序的思路: 归并排序采用的是分治的思想,就是将数组进行分隔,直到最小的单位(两个元素),然后对最小的单位进行排序.最后将排好序的单位依次遍历到数组中. 1 将数组进行分隔,直到不能再分的最 ...

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

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

  7. Java--十大排序算法之归并排序

    前言 本系列排序包括十大经典排序算法. 使用的语言为:Java 结构为: 定义抽象类Sort里面实现了,交换,大小比较等方法.例如交换两个值,直接传入下标就可以了.其他的具体排序的类都继承抽象类Sor ...

  8. 成绩排序的c语言算法,成绩排序系统(练习排序算法和复习C语言)

    成绩排序系统(练习排序算法和复习C语言) 实验一 一.实验目的 1.回顾C语言中的输入.输出及结构体等相关知识点: 2.回顾函数的使用: 3.掌握插入排序.交换排序.选择排序中的常用排序的算法思想: ...

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

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

最新文章

  1. 【TensorFlow2.0】(1) tensor数据类型,类型转换
  2. 人工智能时代:互联网推动制造业升级的四大方向
  3. Linux futex 快速同步互斥机制简介
  4. Boost:验证atomic <>不会在成员指针上提供算术运算
  5. java调用WCF问题
  6. 3、jeecg 笔记之 模糊查询
  7. dismiss ios pop效果_iOS 动画框架pop使用方法
  8. python网站框架下载_web.py首页、文档和下载 - Python框架 - OSCHINA - 中文开源技术交流社区...
  9. Segnet的caffe训练环境搭建
  10. 爬虫-性能相关- twisted-tornado
  11. Spring Boot 学习系列(08)—自定义servlet、filter及listener
  12. pytorch 语义分割loss_关于pytorch语义分割二分类问题的两种做法
  13. element-ui 源码学习
  14. Agile Web Application Development with Yii 1.1 and PHP5
  15. Java toString()方法
  16. java中Action层、Service层和Dao层的功能区分
  17. 系统性能优化- Session丢失
  18. Qt中出现0xc0000135错误
  19. someone you loved 歌词翻译
  20. 华为鸿蒙国内厂商适配,华为再放大招!鸿蒙系统将适配高通/联发科手机:获国产厂商力挺...

热门文章

  1. Java控制台游戏~600行代码实现打怪小游戏
  2. 《郑军的回忆》文章记录了我3年的痛苦过去
  3. 网络安全笔记-Web架构
  4. Axure 中继器表格背景颜色交替不成功
  5. Java中Double与BigDecimal的互转,Date和LocalDateTime互转
  6. 亚马逊echo中国使用_我需要Amazon Echo才能使用Alexa吗?
  7. 塔望 · 食界人物|中国功能饮料A股第一股东鹏饮料创始人林木勤
  8. 使用numpy数组索引方法获取指定行列位置的数值内容
  9. 数字档案管理系统解决方案 - 数字化档案建设方案
  10. 像素及其表示,灰度图