voidmerge(vector<int> &vec, int lo, int mid, int hi){
vector<int> save;
//临时数组
std::copy(vec.begin(), vec.end(), back_inserter(save));
int i = lo, j = mid + 1;
for (int k = lo; k <= hi; k++) { //从lo向hi遍历if (i > mid) vec[k] = save[j++]; //(1)合并完之后,右半边部分还有剩余 elseif (j > hi) vec[k] = save[i++]; //(2)合并完之后,左半部分还有剩余 //以下两部分均为合并完elseif (save[i] > save[j]) vec[k] = save[j++]; //(3) 不能和(1)(2)同时进入,否则可能越界,因此需要使用else ifelse vec[k] = save[i++];
}
}
递归方式
voidmerge_sort(vector<int> &vec, int lo, int hi){
if (lo < hi) {
int mid = (lo + hi) / 2;
merge_sort(vec, lo, mid);
merge_sort(vec, mid + 1, hi);
merge(vec, lo, mid, hi);
}
}
迭代方式
voidmerge_sort(vector<int> &vec, int lo, int hi){
for (int seg = 1; seg < vec.size(); seg += seg) //步长,亦或是子数组的sizefor (int i = lo; i < vec.size() - seg; i += seg + seg){
int lo = min(i, vec.size());
int mid = min(i + seg - 1, vec.size());
int hi = min(i + 2 * seg -1, vec.size() - 1);
merge (vec, lo, mid, hi);
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)