归并排序(包括完整代码)
创作时间:
作者:
@小白创作中心
归并排序(包括完整代码)
引用
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]<<" ";
}
}
热门推荐
研究发现橄榄叶子的提取物健康益处与潜在的风险
橄榄叶提取物的功效:心血管健康的守护者
运城交警人性化执法获外地司机点赞:执法有温度,服务暖人心
运城市车管所地址及电话一览
五台山斋饭:一份神圣的素食之旅
成吉思汗铁木真8子6女的结局:从汗国创立到婚姻联姻
【细数天然产物各大门派】 之植物科属篇
护肤品有2个保质期,你知道吗?
化妆品如何保存 如何判断化妆品是否变质
护肤品有2个保质期,你知道吗?
虫草泡水还是煮水?医生告诉你真相!
厦门周边自驾游打卡网红景点:火山岛、东山岛必去打卡点攻略
厦门周边亲子游:小嶝岛赶海&方特梦幻王国,让周末精彩纷呈!
2024湖北企业百强榜单发布:中建三局首登榜首,9家企业营收超千亿
春运“大考”,充换电服务如何做好保障
纯电车主返乡攻略,这些事必须提前知道
辅酶Q10和降压药能一起吃吗
元太宗窝阔台——元朝推向繁荣的有功之君
75年来成都经济规模不断迈上新台阶
2025QS全球商科硕士排名发布!法国高商五大领域闪耀全球!
郑和七下西洋的深远意义
王者荣耀:射手与辅助的黄金搭档,解锁上分新姿势
王者荣耀17个射手英雄的理想型辅助搭配攻略
冬季来了!英轩教你300马力拖拉机保养秘籍
《你的名字》圣地巡礼:一场跨越现实与动画的青春之旅
耶路撒冷:三大宗教圣地巡礼全攻略
“嘻嘻 不嘻嘻”:职场人的社交密码与生存智慧
“嘻嘻带”成社交新宠:你学会了吗?
云台山电音节:焦作夏日狂欢必打卡!
云台山:焦作必打卡的自然奇观!