归并排序(包括完整代码)
创作时间:
作者:
@小白创作中心
归并排序(包括完整代码)
引用
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]<<" ";
}
}
热门推荐
氟桂利嗪的不良反应有哪些
在香港注册结婚:流程、费用及教堂婚礼指南
卷学历能找到更好工作吗?
首付比例降低吸引购房者的优势及影响
如何判断槽钢层所在楼层及其影响
CVT、AT和MT变速箱的真实寿命与维护指南
高拱与张居正:从盟友到对手的恩怨纠葛
跑步不是唯一的运动,9个变式跳绳让你瘦身塑形
离婚彩礼分配问题:法律规定的公平原则和实践操作
彩礼在传统习俗与现代社会中如何平衡
寒湿伤害分五级,这些表现提示你的内脏受寒了
“史无前例”!双燃料船订单激增
10艘超百亿!这家船厂再获大单!希腊船东首订双燃料集装箱船
桑黄成分及其抗肿瘤作用机制研究进展
电针疗法的临床应用
同性婚姻合法化:社会观念的转变与法律制度的进步
误吞鱼刺后多少天安全
车被拳头大的冰雹砸了,保险会拒赔吗?开车一半遇到雹灾应该怎么躲?
南京旅游最佳时长推荐:几天游玩最适宜
心跳快、耳鸣怎么回事,怎么办
泰国街头惊现人妖身影,揭秘其背后不为人知的起源与历史
学生寒假工不给工资怎么办?法律专家为你支招
时代精神的传承与青年担当—从《哪吒》看文化与精神的映射
轻松掌握!多种方法教你将手机照片导入U盘,释放存储空间!
福特底盘的性能和设计特点如何?这款底盘在实际驾驶中的表现如何?
向日葵花盘的功效与作用及药用价值
拓展坞接键盘鼠标有延迟吗
Wilms瘤是什么病,能治愈吗
洗鞋指南:让你的球鞋永葆如新!
如何选择适合的家居装修床垫材质?这样的材质如何提供良好支撑?