模板在文末,以下步骤方便理解记忆。
先贴一张快速排序模板步骤,用于对比记忆
归并排序步骤:
(0)如果数组左边界L ≥ 数组右边界,则不需要排序,直接return。
(1)直接取数组正中间的数,即 mid = (L+R) / 2为边界。
(2)先递归,对 L~mid ,mid+1 ~ R 这两个区间的数组调用归并排序函数。
(3)对于每次归并,它的面前有两个排好序的数组,即 [ L, mid ] 和 [ mid+1, R ],接下来需要把这两个数组合为另一个有序的数组。
具体操作是采用双下标指针,首先令 i = L,j = mid + 1(即两个数组的左边界)
接着,让q[ i ]和q[ j ]中更小的那个先放进 temp 数组里,然后 i++ 或 j++,以此类推。
当其中一个下标指针到达末端时,直接将另一个数组原封不动的拷贝进 temp 数组里。
(4)最后把 temp 数组拷贝到 q 数组中。(这一步容易写错)
#includeusing namespace std; const int N = 100010; int n; int q[N], temp[N]; void merge_sort(int q[], int l, int r) { if(l >= r) return; int mid = (l+r) >> 1; merge_sort(q, l, mid), merge_sort(q, mid+1, r); int i = l, j = mid+1, k = 0; while(i <= mid && j <= r) //对应步骤(3),而且当两个数组的指针都没有越界时才这么做 { if(q[i] < q[j]) temp[k++] = q[i++]; else temp[k++] = q[j++]; } while(i <= mid) temp[k++] = q[i++]; //如果i没有越界,则将i后面的原封不动地拷贝进去 while(j <= r) temp[k++] = q[j++]; //如果j没有越界,则将j后面拷贝进去 //q和temp数组的范围不同,因此需要两个变量i,j // 注意不是i <= n for(int i=l, j=0; i <= r; ++i, ++j) q[i] = temp[j]; //步骤(4),注意写法 } int main() { scanf("%d", &n); for(int i=0;i
猜你喜欢
- 14天前(兰州旅游文化产业发展有限公司)甘肃省兰州市2023年乡村旅游暨A级旅游景区管理工作培训班开班
- 14天前(希尔顿2021活动)希尔顿集团618盛夏大促开启
- 14天前(2020海丝之路文化博览会)2023海丝之路文化和旅游博览会开幕
- 14天前(万豪酒店 珠海)万豪酒店品牌启航珠海金湾,续写大湾区拓展新篇
- 14天前(fender japan hybrid)Fender东京旗舰店盛大开幕在即,开售商品和店内服务提前揭晓
- 14天前(甘州区文化旅游局)2025甘津文旅资源对接推介会在兰州举办
- 14天前(澳涞坞是什么)从最美山庄到世界舞台:澳涞山庄见证世界十佳旅居城市评选
- 14天前(星级饭店的发展困境)星级饭店转型之路:从市场逻辑到行业实践的深度探索
- 14天前(“百场黄梅唱响百家景区”示范演出活动在黄山风景区举行)“百场黄梅唱响百家景区”示范演出活动在黄山风景区举行
- 14天前(殷建祥简历)全国十大牛商解码:殷建祥如何用178天技术突围打造星空梦星空房
网友评论
- 搜索
- 最新文章
- (2020广州车展哈弗)你的猛龙 独一无二 哈弗猛龙广州车展闪耀登场
- (哈弗新能源suv2019款)智能科技颠覆出行体验 哈弗重塑新能源越野SUV价值认知
- (2021款全新哈弗h5自动四驱报价)新哈弗H5再赴保障之旅,无惧冰雪护航哈弗全民电四驱挑战赛
- (海南航空现况怎样)用一场直播找到市场扩张新渠道,海南航空做对了什么?
- (visa jcb 日本)优惠面面俱到 JCB信用卡邀您畅玩日本冰雪季
- (第三届“堡里有年味·回村过大年”民俗花灯会活动)第三届“堡里有年味·回村过大年”民俗花灯会活动
- (展示非遗魅力 长安启源助力铜梁龙舞出征)展示非遗魅力 长安启源助力铜梁龙舞出征
- (阿斯塔纳航空公司)阿斯塔纳航空机队飞机数量增至50架
- (北京香港航班动态查询)香港快运航空北京大兴新航线今日首航
- (我在港航“呵护”飞机 每一次安全着陆就是最好的荣誉)我在港航“呵护”飞机 每一次安全着陆就是最好的荣誉
- 热门文章