归并排序(包括完整代码)
创作时间:
作者:
@小白创作中心
归并排序(包括完整代码)
引用
CSDN
1.
https://blog.csdn.net/Chenqin1879/article/details/140875935
归并排序是一种采用分治策略进行排序的算法,而分治的本质是将一个大规模的问题分解为若干规模较小的相同子问题,分而治之。
由于排序问题给定的是一个无序序列,所以可以把待排序元素分解成两个规模大致相等的子序列,如果不易解决,则将得到的子序列继续分解,直到子序列包含的元素个数为1(因为单个元素的序列本身就是有序的),此时就可以进行合并,从而得到一个完整的有序序列。以序列(42,15,20,6,8,38,50,12)为例:
从上图可以看出,首先将待排序元素分成大小大致相同的两个子序列,然后把子序列分成两个大小大致相同的两个子序列,如此下去,直到分解成一个元素时为止,这时含有一个元素的子序列就是有序的。然后再执行合并操作,将两个有序的子序列合并成一个有序序列,如此下去,制直到所有的元素都合并为一个有序序列时为止。
具体代码如下:
#include<bits/stdc++.h>
using namespace std;
void he(int A[],int low,int mid,int high){
int *B=new int[high-low+1];//申请一个动态数组进行辅助
int i=low,j=mid+1,k=0;
while(i<=mid&&j<=high){//按从小到大的顺序放入辅助数组中
if(A[i]<=A[j])
B[k++]=A[i++];
else
B[k++]=A[j++];
}
while(i<=mid) B[k++]=A[i++];//将数组中剩下的元素放入辅助数组中
while(j<=high) B[k++]=A[j++];
for(i=low,k=0;i<=high;i++,k++){//将排序好的辅助数组复制到原数组中
A[i]=B[k];
}
delete[] B;//释放内存空间
}
void fen(int A[],int low,int high){
if(low<high){
int mid=(low+high)/2;//取中点
fen(A,low,mid);//对A[low:mid]中的元素合并排序
fen(A,mid+1,high);//对A[mid+1:high]中的元素合并排序
he(A,low,mid,high);//合并
}
}
int main(){
int a[1005];
int n;
cin>>n;
for(int i=0;i<n;i++){
cin>>a[i];
}
fen(a,0,n-1);//调用函数
for(int i=0;i<n;i++){
cout<<a[i]<<" ";
}
}
热门推荐
历史百科:古代皇帝的弟弟叫什么?皇太弟为何最悲惨?
野史趣闻:赵匡胤为什么传位给他的弟弟?
球蛋白偏低:原因与对策
“福建舰”首航试验成功!这些顶尖高校为国立功!
Nature新子刊“npj complexity”开篇评论:通往复杂性之路
外籍人士在华养老金的正确领取方式
甲状腺功能异常对生育的影响:专家详解,助你备孕无忧!
K-Pop为何成为偶像“性化”的重灾区?
一勺猪油等于五副药?常吃猪油是养生还是有害?一次性告诉您真相
为啥大部分的互联网大厂员工工资那么高?
淮安清江浦古城核心区焕新
2024年U.S.News世界大学排名公布:郑州大学超北航西工大多所985
详解ArcGIS 水文分析模型构建
“无麸质饮食”魅力几何?这本制作指南带你打开面食新世界
未来农民的翻身之路,要么新生,要么灭亡!
工程测量技术的发展现状及前景的应用研究
遗产税:探讨其在全球范围内的实施与影响
養貓咪的好處
为何哈尔滨纯电车卖不过增程,增程卖不过插电混动车?
孕期羊水破了怎么办
如何选择显示器色域?适合你的主流标准解析
JAMA子刊:大反转!科学家发现,运动量大不会加速冠脉钙化进展
急性黄斑神经视网膜病变:从病因到诊断与治疗的全面解析
英国大学怎么没有拉丁
新能源电池报告查询指南:五种查询方式及关键数据解读
冬季刮痧养生:防治中风、关节炎、皮肤病的自然疗法
珍稀"孙小头"银币,一枚价值数百万!您的藏品是哪种天价宝贝
栈溢出攻击与防御策略:Canaries、DEP与ASLR
弦歌不辍 古今共鸣——“传统@现代 民族音乐文化展”在京开展
电机基以上调速,电机调速技术讨论