網站首頁 編程語言 正文
算法思路
歸并排序是一種分治算法:首先將數組分成兩半,然后對每一半進行歸并排序,最后將兩個有序的子數組合并,以得到最終的排序數組。為了簡潔下面代碼中會調用 STL 的 i n p l a c e _ m e r g e inplace\_merge inplace_merge 方法,這個方法的作用正是將兩個連續的有序區間合并為一個有序區間,當然也可以自己按合并有序鏈表的思路寫一個 m e r g e merge merge 方法~
a. 遞歸
自頂向下的遞歸排序
void merge_sort(vector<int> &li, int s, int e) {//li[s,e)為待排序的子數組
if (e - s <= 1)
return;
int mid = (s + e) / 2;
merge_sort(li, s, mid);
merge_sort(li, mid, e);
inplace_merge(li.begin() + s, li.begin() + mid, li.begin() + e);//合并有序區間[s,mid)和[mid,e)
}
b. 棧模擬遞歸
用一個棧模擬遞歸排序中區間處理的過程,注意一個區間可能會在棧中出現兩次:第一次其兩個子區間還未排序,第二次其兩個子區間已經有序,所以需要有一個額外的標志位來區分一個區間在棧中的這兩種狀態。
void merge_sort_stack(vector<int> &li, int s, int e) {//li[s,e)為待排序的子數組
stack<tuple<int, int, int>> st;
st.emplace(s, e, 0);
while (!st.empty()) {
auto [l, r, tag] = st.top();//當前區間為[l,r) , 標志位為tag
st.pop();
if (tag == 0) {//當前區間第一次出現
if (r - l <= 1)
continue;
int mid = (l + r) / 2;
st.emplace(l, r, 1);
st.emplace(l, mid, 0);
st.emplace(mid, r, 0);
} else {//當前區間第二次出現
int mid = (l + r) / 2;
inplace_merge(li.begin() + l, li.begin() + mid, li.begin() + r);//合并有序區間[l,mid)和[mid,r)
}
}
}
c. 遞推
自底向上的遞推:首先兩兩一組的合并長為 2 0 2^0 20 的子數組,再兩兩一組的合并長為 2 1 2^1 21 的子數組, ? \cdots ? ,直到 2 k 2^k 2k 不小于數組長度時遞推結束。注意每一輪合并中最后一組的右邊的子數組的長度可能小于 2 k 2^k 2k。
void merge_sort(vector<int> &li, int s, int e) {//li[s,e)為待排序的子數組
int n = e - s;
for (int len = 1; len < n; len *= 2)//合并的子數組的長度len不超過n
for (int i = s; i + len < e; i += len * 2)//逐對枚舉兩個相鄰的子數組
inplace_merge(li.begin() + i, li.begin() + i + len, li.begin() + min(e, i + len * 2));//合并有序區間[i,i+len)和[i+len,min(e,i+len*2))
}
原文鏈接:https://blog.csdn.net/weixin_40519680/article/details/132906998
- 上一篇:沒有了
- 下一篇:沒有了
相關推薦
- 2022-08-26 詳解Python中元組的三個不常用特性_python
- 2024-01-30 MongoDB 聚合查詢在數據統計中的應用
- 2022-09-04 python?matplotlib庫繪圖實戰之繪制散點圖_python
- 2022-03-22 C++賦值運算符_C 語言
- 2022-05-02 Python?私有屬性與私有方法_python
- 2022-12-05 深入了解C++封閉類的定義與使用_C 語言
- 2022-04-12 Cannot read property ‘forEach‘ of undefined
- 2023-05-15 使用Bash讀取和處理CSV文件的方法_linux shell
- 欄目分類
-
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支