C语言 归并排序算法
归并排序算法完全遵循分治模式。直观上其操作如下:
分解:分解待排序的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语言 归并排序算法相关推荐
- 归并排序算法怎么优化?本文给你讲清楚
排序算法是一种能将一系列数据按照特定顺序进行排列的算法,比如说一个学校的考试分数从高到低排名.一个公司的数据报表从大到小排列,都需要用到排序算法.常见的排序算法有冒泡排序.快速排序.字典排序.归并排序 ...
- 归并排序过程实现c语言,C语言归并排序详解
C语言归并排序详解 发布日期:2015-12-31 11:16 来源: 标签: 编程语言 C教程 C语言归并排序 C语言归并排序算法 本章我们主要学习C语言实现排序算法之归并排序,对归并排序的原理及实 ...
- C语言merge sort归并排序算法(附完整源码)
C语言merge sort归并排序算法 merge sort归并排序算法的完整源码(定义,实现) merge sort归并排序算法的完整源码(定义,实现) #ifndef MERGE_SORT_H # ...
- 归并排序算法(C语言版本)
基本思想 归并排序(Merge Sort)是利用归并的思想实现的排序方法,该算法采用经典的分治(divide-and-conquer)策略(分治法将问题分成一些小的问题然后进行递归求解,而治的阶段则将 ...
- c语言归并排序代码详细注释,C语言实现归并排序算法
C语言实现归并排序算法 归并排序是创建在归并操作上的一种有效的排序算法.下面小编为大家整理了C语言实现归并排序算法,希望能帮到大家! 归并排序(Merge sort)是创建在归并操作上的一种有效的排序 ...
- c语言归并排序代码详细注释,C语言实现排序算法之归并排序详解
排序算法中的归并排序(Merge Sort)是利用"归并"技术来进行排序.归并是指将若干个已排序的子文件合并成一个有序的文件. 一.实现原理: 1.算法基本思路 设两个有序的子文件 ...
- 2路归并排序算法(C语言)
转载自:http://blog.csdn.net/caryaliu/article/details/7475700 将两个按值有序序列合并成一个按值有序序列,则称之为二路归并排序,下面有自底向上和自顶 ...
- 归并排序算法详解(方法一)之C语言版
一.算法原理 归并排序是一种常用的排序算法,属于稳定排序法,其时间复杂度为 归并排序就是将两个已经分别排好序的数组A和B合并为一个排好序的数组C. 如果数组散乱的数组,则需要将数组元素分别按照长度为d ...
- 归并排序c语言实验报告,归并排序算法及其C语言具体实现
本节介绍一种不同于插入排序和归并排序,其排序的实现思想是先将所有的记录完全分开,然后两两合并,在合并的过程中将其排好序,最终能够得到一个完整的有序表. 例如对于含有 n 个记录的无序表,首先默认表中每 ...
- c语言排序算法 应用与实现,基于C语言排序算法改进与应用.doc
基于C语言排序算法改进与应用 基于C语言排序算法改进与应用 摘 要:介绍了程序语言中排序的原理及应用,阐述了基于C语言的三种主要排序方法,提出了每种排序方法的改进,计算出改进后算法的时间复杂度,编写了 ...
最新文章
- 使用SoapHeader对WebService进行身份验证
- java list数组排序_浅谈对象数组或list排序及Collections排序原理
- 可以发外链的网站_SEO分享:网站推广的四大推广方法
- java局部刷新session过期_Ajax局部页面刷新和History API结合的陷阱
- 如何为你的博客园添加到百度统计
- iOS开发--正则表达式
- 从 AI、芯片到量子计算,阿里达摩院发布 2020 十大科技趋势
- 监听器应用【统计网站人数、自定义session扫描器、踢人小案例】
- 新云php修改,MySQL_新云CMS防采集的代码修改,列表页修改:
打开INC目录下Ne - phpStudy...
- bp神经网络数据预测实例,bp神经网络预测数据
- ubuntu桌面模式下,鼠标右键没有新建文档,的解决方法
- 如何判断自己的IP是否为公网IP?
- 马克飞象自定义代码段风格
- 对挣钱与財富等三个问题的思考
- 广东省计算机二级c语言真题,广东省计算机二级考试题及答案
- 悟已往之不谏,知来者之可追
- 冲量在线创始人刘尧:以信创软硬件结合场景为突破口“占山为王”
- (微信小程序)微信小程序-毕设级项目搭建-微信阅读小程序(内含源码,微信小程序+java逻辑后台+vue管理系统)~不求完美,实现就好
- Arduino+2.4G模块做航模遥控器
- 101条伟大的计算机编程名言 [ROYcms!NT]