归并排序

来源:互联网 发布:网络推广怎么做 编辑:程序博客网 时间:2024/06/17 17:24

归并(Merge)排序法是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的。然后再把有序子序列合并为整体有序序列。

归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。

  将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为2-路归并。

 

#ifndef MERGESORT_H#define MERGESORT_H#include <stdlib.h>template<class T> inline void MergeSort(T *a,int len) //归并排序算法{T *TR = (T *)malloc(sizeof(T) * len); //动态分配一个额外的存储空间MSort(a,TR,0,len-1); //分裂然后调用归并排序free(TR); //释放内存}template<class T> void Merge(T a[],T TR[],int low,int mid,int high) //归并排序{int i = low;int j = mid + 1;int k = 0;while(i <= mid && j <= high){if(a[i] < a[j])  //进行排序存入动态分配的数组中TR[k++] = a[i++];elseTR[k++] = a[j++];}while(i <= mid) //如果前一半中还有未处理完的数据,按顺序移入动态分配的数组内TR[k++] = a[i++];while(j <= high) //如果后一半中还有未处理完的数据,按顺序移入动态分配的数组内TR[k++] = a[j++];for(int v = 0,i = low;i <= high;++v,++i) //将排序好的数据移回到原序列中a[i] = TR[v];}template<class T> void MSort(T a[],T temp[],int low,int high){int mid;if(low < high){mid = (low + high) / 2; //进行分裂MSort(a,temp,low,mid); //将前一半继续分裂MSort(a,temp,mid + 1,high); //将后一半继续分裂Merge(a,temp,low,mid,high); //进行归并排序}}#endif //MERGESORT_H


 

#include "MergeSort.h"#include <stdio.h>int main(){int a[] = {20,19,35,33,17,42,15,55,9,5,8,3,1};int len = sizeof(a) / sizeof(*a);MergeSort(a,len);printf("排序后的数组序列:\n");for(int i = 0;i < len;++i)printf("%d ",a[i]);printf("\n");return 0;}

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 小孩怎么教育都不听怎么办 赵本山怎么办的刘涌 起诉离婚被告不出庭怎么办 安装u盘进入系统怎么办 思讯加密狗坏了怎么办 村主任选不出来怎么办 你的id已被停用怎么办 车牌摇号中签后怎么办 北京车卖了指标怎么办 车的电脑板坏了怎么办 饭卡消磁了怎么办妙招 有好项目没资金怎么办 买的股票涨停了怎么办 考研没过国家线怎么办 中石化的油卡怎么办 5173号被找回了怎么办 谭木匠梳子断了怎么办 198地块上的企业怎么办 天猫投诉不成立怎么办 顾客老嫌瓷砖贵怎么办 公司的公章丢了怎么办 物业不给充电费怎么办 怎么办社保卡去哪里办 单位没给社保卡怎么办 诈骗链接点开了怎么办 私人老板拖欠工资不给怎么办 辞职了工资不发怎么办 老板欠工资不给怎么办 投资平台跑路了怎么办 眼镜太松往下滑怎么办 塑胶水管管断了怎么办 淘宝排名靠后了怎么办 我有古董想出售怎么办 被拍卖公司骗了怎么办 苹果4s铃声太小怎么办 新号码注册微信怎么办 uc不能下种子了怎么办 刚出生的小牛喘怎么办 回奶之后有硬块怎么办 回奶第十天硬块怎么办 断奶期间乳房有硬块怎么办