归并排序算法完全遵循分治模式。直观上其操作如下:

分解:分解待排序的n个元素的序列成各具n/2个元素的两个子序列。

解决:使用归并排序递归地排序两个子序列。

合并:合并两个已排列的子序列以产生已排序的答案。

随着算法自底向上地推进,待合并的已排好序的各序列长度不断增加,最后全部合并成等于原序列长度的一个新的已排列的序列。

// 归并排序
// low, mid, high 均为数组下标#include <stdio.h>
#include <stdlib.h>#define length(a) ((sizeof(a))/(sizeof(a[0])))void printArray(int* a, int length)
{int temp;for (temp = 0; temp < length; temp++){printf("%d ", a[temp]);}printf("\n");
}void mergeSort(int* a, int low, int high);
void merge(int* a, int low, int mid, int high);int main(void)
{int a[] = { 5,2,4,6,1,3,6 };printf("排序前:\n");printArray(a, length(a));mergeSort(a, 0, length(a) - 1);printf("排序后:\n");printArray(a, length(a));return 0;
}
void mergeSort(int* a, int low, int high)
{int mid;if (low < high){mid = (low + high) / 2;mergeSort(a, low, mid);mergeSort(a, mid + 1, high);merge(a, low, mid, high);}
}
void merge(int* a, int low, int mid, int high)
{int i, j, k;//左半数组和右半数组的长度int n1 = mid - low + 1;int n2 = high - mid;//为左半数组和右半数组开辟空间,预留多一个元素的位置存放哨兵int* L = (int*)malloc(sizeof(int) * (n1 + 1));int* R = (int*)malloc(sizeof(int) * (n2 + 1));//将原数组中的元素分别放入左右数组for (i = 0; i < n1; i++)L[i] = a[low + i];for (j = 0; j < n2; j++)R[j] = a[mid + j + 1];//在左半数组和右半数组的最后放置哨兵,这样做无需检查是否有数组为空L[i] = 2147483647;R[j] = 2147483647;//将左右数组中较小的数逐渐放回原数组i = j = 0;for (k = low; k <= high; k++){if (L[i] <= R[j])a[k] = L[i++];elsea[k] = R[j++];}free(L);free(R);
}

C语言 归并排序算法相关推荐

  1. 归并排序算法怎么优化?本文给你讲清楚

    排序算法是一种能将一系列数据按照特定顺序进行排列的算法,比如说一个学校的考试分数从高到低排名.一个公司的数据报表从大到小排列,都需要用到排序算法.常见的排序算法有冒泡排序.快速排序.字典排序.归并排序 ...

  2. 归并排序过程实现c语言,C语言归并排序详解

    C语言归并排序详解 发布日期:2015-12-31 11:16 来源: 标签: 编程语言 C教程 C语言归并排序 C语言归并排序算法 本章我们主要学习C语言实现排序算法之归并排序,对归并排序的原理及实 ...

  3. C语言merge sort归并排序算法(附完整源码)

    C语言merge sort归并排序算法 merge sort归并排序算法的完整源码(定义,实现) merge sort归并排序算法的完整源码(定义,实现) #ifndef MERGE_SORT_H # ...

  4. 归并排序算法(C语言版本)

    基本思想 归并排序(Merge Sort)是利用归并的思想实现的排序方法,该算法采用经典的分治(divide-and-conquer)策略(分治法将问题分成一些小的问题然后进行递归求解,而治的阶段则将 ...

  5. c语言归并排序代码详细注释,C语言实现归并排序算法

    C语言实现归并排序算法 归并排序是创建在归并操作上的一种有效的排序算法.下面小编为大家整理了C语言实现归并排序算法,希望能帮到大家! 归并排序(Merge sort)是创建在归并操作上的一种有效的排序 ...

  6. c语言归并排序代码详细注释,C语言实现排序算法之归并排序详解

    排序算法中的归并排序(Merge Sort)是利用"归并"技术来进行排序.归并是指将若干个已排序的子文件合并成一个有序的文件. 一.实现原理: 1.算法基本思路 设两个有序的子文件 ...

  7. 2路归并排序算法(C语言)

    转载自:http://blog.csdn.net/caryaliu/article/details/7475700 将两个按值有序序列合并成一个按值有序序列,则称之为二路归并排序,下面有自底向上和自顶 ...

  8. 归并排序算法详解(方法一)之C语言版

    一.算法原理 归并排序是一种常用的排序算法,属于稳定排序法,其时间复杂度为 归并排序就是将两个已经分别排好序的数组A和B合并为一个排好序的数组C. 如果数组散乱的数组,则需要将数组元素分别按照长度为d ...

  9. 归并排序c语言实验报告,归并排序算法及其C语言具体实现

    本节介绍一种不同于插入排序和归并排序,其排序的实现思想是先将所有的记录完全分开,然后两两合并,在合并的过程中将其排好序,最终能够得到一个完整的有序表. 例如对于含有 n 个记录的无序表,首先默认表中每 ...

  10. c语言排序算法 应用与实现,基于C语言排序算法改进与应用.doc

    基于C语言排序算法改进与应用 基于C语言排序算法改进与应用 摘 要:介绍了程序语言中排序的原理及应用,阐述了基于C语言的三种主要排序方法,提出了每种排序方法的改进,计算出改进后算法的时间复杂度,编写了 ...

最新文章

  1. 使用SoapHeader对WebService进行身份验证
  2. java list数组排序_浅谈对象数组或list排序及Collections排序原理
  3. 可以发外链的网站_SEO分享:网站推广的四大推广方法
  4. java局部刷新session过期_Ajax局部页面刷新和History API结合的陷阱
  5. 如何为你的博客园添加到百度统计
  6. iOS开发--正则表达式
  7. 从 AI、芯片到量子计算,阿里达摩院发布 2020 十大科技趋势
  8. 监听器应用【统计网站人数、自定义session扫描器、踢人小案例】
  9. 新云php修改,MySQL_新云CMS防采集的代码修改,列表页修改: 打开INC目录下Ne - phpStudy...
  10. bp神经网络数据预测实例,bp神经网络预测数据
  11. ubuntu桌面模式下,鼠标右键没有新建文档,的解决方法
  12. 如何判断自己的IP是否为公网IP?
  13. 马克飞象自定义代码段风格
  14. 对挣钱与財富等三个问题的思考
  15. 广东省计算机二级c语言真题,广东省计算机二级考试题及答案
  16. 悟已往之不谏,知来者之可追
  17. 冲量在线创始人刘尧:以信创软硬件结合场景为突破口“占山为王”
  18. (微信小程序)微信小程序-毕设级项目搭建-微信阅读小程序(内含源码,微信小程序+java逻辑后台+vue管理系统)~不求完美,实现就好
  19. Arduino+2.4G模块做航模遥控器
  20. 101条伟大的计算机编程名言 [ROYcms!NT]

热门文章

  1. 一加3t刷机后还卡_一加3t刷机工具大全+3个ROM
  2. flash builder 4.7破解亲测可用
  3. java 缓存文件_java实现酷狗音乐临时缓存文件转换为MP3文件的方法
  4. x-studio教程之 - 导入csb并发布到CocosStudio2.x兼容工程
  5. 高速串行收发器的预加重与均衡
  6. Git-LFS:大文件也有了版本管理
  7. 智能手机屏幕尺寸和分辨率一览表
  8. Linux搭建Weblogic集群
  9. webflux解决get请求中文乱码问题
  10. ExtJs6学习(一)【ExtJs介绍】