归并排序
来源:互联网 发布:网络管理与维护 王平安 编辑:程序博客网 时间:2024/04/28 18:26
归并排序是一种外部存储设备最常用的排序方法。该方法是分治法典型应用。
归并排序一般分为2个步骤:
step1.将排序数据分成若干份,然后使用适当的内部排序法进行排序,得到若干有序序列
step2.将step1的有序序列归并为一个大的有序序列(通常是两两归并,所以又称二路归并),等到所有的序列都归并为一个序列后,就排序好了。
因此要解决2个问题:1.如何划分序列 2.如何进行归并操作
1.划分序列
(1)将序列从中间分成左子区间和右子区间
(2)将左子区间从中间分成左右2个子区间,再将2个子区间继续划分,直到子区间内的元素个数为1个或者2个
(3)同理,将右子区间从中间分成左右2个子区间,再将2个子区间继续划分,直到子区间内的元素个数为1个或者2个
从上面的步骤,我们会很自然的想到用递归来解决。
2.归并操作
(1)从左和右区间开始处,各取一个元素比较大小,较小的元素存入归并数组
(2)依次进行(1)的操作,直到有一个区间把元素取空为止,比如左区间的元素应经全部存入归并数组,而有区间还有3个元素(假设)没有存入归并数组,那么着3个元素肯定比左区间的所有数值都打。因此,把右区间剩下的3个元素全部存入归并区间。
(3)至此左右2个区间的归并操作完成
至此,2个问题解决了,那么该怎么将2个操作组合呢?
还是要遵循归并排序的2个步骤:
1.首先,采用递归划分出左区间和右区间
2.其次,对这两个区间进行归并操作
下面是代码:
#include <stdio.h>#define MAXSIZE100/*===================================*//*归并排序 *//*===================================*/int merge_array[MAXSIZE];//归并函数void merging(int *a,int low, int high){int i, j, k, S, Q, mid;i = low;//左半区下标k = 1;//merge_array归并数组下标mid = (low + high) / 2;j = mid + 1;//右半区下标while((i <= mid) && (j <= high)){//分别从左半区和右半区取一个数据,把较小的数据存入归并数组if(a[i] < a[j]){merge_array[k] = a[i];i++;}else{merge_array[k] =a[j]; j++;}k++;}//如果2个组中有一个结束,则把未结束组的其余元素全部送mergeif(i > mid)//左半区结束{S = j;//S存储接下来a数组能要顺序存入merge_array归并数组内的起始下标Q = high;//S存储接下来a数组能要顺序存入merge_array归并数组内的终止下标}else//右半区结束{S = i;Q = mid;}for(i=S; i<=Q; i++, k++)//从a[S]开始,把未结束的区间内剩余元素依次存入merge_array内merge_array[k] = a[i];for(i=low, j=1; i<=high; i++, j++)//把归并数组内的数据按照对应的下标复制到原来数组aa[i] = merge_array[j];}//归并排序void merge_sort(int *a, int low, int high){int mid;if(low == high)//low==high,即区间内元素个数为1或2时,结束递归return;mid = (low + high) / 2;//以中点分割区间merge_sort(a, low, mid);//左半区间递归merge_sort(a, mid+1, high);//右半区间递归merging(a, low, high);//对左右2个区间进行归并操作}/*===================================*//*主函数 *//*===================================*/int main(){int i;int data[MAXSIZE] = {0, 3, 7, 10, 9, 1, 8, 6, 5, 2, 4, 12, 11};merge_sort(data, 1, 12);for(i=1; i<13; i++){printf("%d ", data[i]);}}
0 0
- 归并排序-归并排序
- 归并和归并排序
- 归并与归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 排序::归并
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 两个双卡的Karbonn手机
- Android 数据存储
- oracle数据库的导入导出方法
- Verilog HDL的基本语法
- Xamarin ios开发 UITableView
- 归并排序
- 个Java培训 - 让你成为专业要求
- setprecision、fixed、showpoint的用法总结(经典!!超经典!!)
- oracle ip 查询
- hdu 1052
- win下部署tomcat
- Android学习
- CSDN开源夏令营:中期完成情况
- HDU 2578 Dating with girls(1)