归并排序(Merge Sort)
基本思想:
归并(Merge)排序法是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的。然后再把有序子序列合并为整体有序序列。
归并排序示例:
合并方法:
若i>m 或j>n,转⑷ //其中一个子表已合并完,比较选取结束
- //选取r[i]和r[j]较小的存入辅助数组rf
如果r[i]<r[j],rf[k]=r[i]; i++; k++; 转⑵
否则,rf[k]=r[j]; j++; k++; 转⑵ - //将尚未处理完的子表中元素存入rf
如果i<=m,将r[i…m]存入rf[k…n] //前一子表非空
如果j<=n , 将r[j…n] 存入rf[k…n] //后一子表非空 - 合并结束。
//将r[i…m]和r[m +1 …n]归并到辅助数组rf[i…n] void Merge(ElemType *r,ElemType *rf, int i, int m, int n) { int j,k; for(j=m+1,k=i; i<=m && j <=n ; ++k){ if(r[j] < r[i]) rf[k] = r[j++]; else rf[k] = r[i++]; } while(i <= m) rf[k++] = r[i++]; while(j <= n) rf[k++] = r[j++]; }
归并的迭代算法
1 个元素的表总是有序的。所以对n 个元素的待排序列,每个元素可看成1 个有序子表。对子表两两合并生成n/2个子表,所得子表除最后一个子表长度可能为1 外,其余子表长度均为2。再进行两两合并,直到生成n 个元素按关键码有序的表。
void print(int a[], int n){ for(int j= 0; j<n; j++){ cout<<a[j] <<" "; } cout<<endl; } //将r[i…m]和r[m +1 …n]归并到辅助数组rf[i…n] void Merge(ElemType *r,ElemType *rf, int i, int m, int n) { int j,k; for(j=m+1,k=i; i<=m && j <=n ; ++k){ if(r[j] < r[i]) rf[k] = r[j++]; else rf[k] = r[i++]; } while(i <= m) rf[k++] = r[i++]; while(j <= n) rf[k++] = r[j++]; print(rf,n+1); } void MergeSort(ElemType *r, ElemType *rf, int lenght) { int len = 1; ElemType *q = r ; ElemType *tmp ; while(len < lenght) { int s = len; len = 2 * s ; int i = 0; while(i+ len <lenght){ Merge(q, rf, i, i+ s-1, i+ len-1 ); //对等长的两个子表合并 i = i+ len; } if(i + s < lenght){ Merge(q, rf, i, i+ s -1, lenght -1); //对不等长的两个子表合并 } tmp = q; q = rf; rf = tmp; //交换q,rf,以保证下一趟归并时,仍从q 归并到rf } } int main(){ int a[10] = {3,1,5,7,2,4,9,6,10,8}; int b[10]; MergeSort(a, b, 10); print(b,10); cout<<"结果:"; print(a,10); }
两路归并的递归算法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | <span class = "kwd" > void </span><span class = "pln" > </span><span class = "typ" >MSort</span><span class = "pun" >(</span><span class = "typ" >ElemType</span><span class = "pln" > </span><span class = "pun" >*</span><span class = "pln" >r</span><span class = "pun" >,</span><span class = "pln" > </span><span class = "typ" >ElemType</span><span class = "pln" > </span><span class = "pun" >*</span><span class = "pln" >rf</span><span class = "pun" >,</span><span class = "kwd" > int </span><span class = "pln" > s</span><span class = "pun" >,</span><span class = "pln" > </span><span class = "kwd" > int </span><span class = "pln" > t</span><span class = "pun" >)</span><span class = "pln" > </span><span class = "lit" >2.</span><span class = "pun" >{</span><span class = "pln" > </span><span class = "lit" >3.</span><span class = "pln" > </span><span class = "typ" >ElemType</span><span class = "pln" > </span><span class = "pun" >*</span><span class = "pln" >rf2</span><span class = "pun" >;</span><span class = "pln" > </span><span class = "lit" >4.</span><span class = "pln" > </span><span class = "kwd" > if </span><span class = "pun" >(</span><span class = "pln" >s</span><span class = "pun" >==</span><span class = "pln" >t</span><span class = "pun" >)</span><span class = "pln" > r</span><span class = "pun" >[</span><span class = "pln" >s</span><span class = "pun" >]</span><span class = "pln" > </span><span class = "pun" >=</span><span class = "pln" > rf</span><span class = "pun" >[</span><span class = "pln" >s</span><span class = "pun" >];</span><span class = "pln" > </span><span class = "lit" >5.</span><span class = "pln" > </span><span class = "kwd" > else </span><span class = "pln" > </span><span class = "lit" >6.</span><span class = "pln" > </span><span class = "pun" >{</span><span class = "pln" > </span><span class = "lit" >7.</span><span class = "pln" > </span><span class = "kwd" > int </span><span class = "pln" > m</span><span class = "pun" >=(</span><span class = "pln" >s</span><span class = "pun" >+</span><span class = "pln" >t</span><span class = "pun" >)/</span><span class = "lit" >2</span><span class = "pun" >;</span><span class = "pln" > </span><span class = "com" > /*平分*p 表*/ </span><span class = "pln" > </span><span class = "lit" >8.</span><span class = "pln" > </span><span class = "typ" >MSort</span><span class = "pun" >(</span><span class = "pln" >r</span><span class = "pun" >,</span><span class = "pln" > rf2</span><span class = "pun" >,</span><span class = "pln" > s</span><span class = "pun" >,</span><span class = "pln" > m</span><span class = "pun" >);</span><span class = "pln" > </span><span class = "com" > /*递归地将p[s…m]归并为有序的p2[s…m]*/ </span><span class = "pln" > </span><span class = "lit" >9.</span><span class = "pln" > </span><span class = "typ" >MSort</span><span class = "pun" >(</span><span class = "pln" >r</span><span class = "pun" >,</span><span class = "pln" > rf2</span><span class = "pun" >,</span><span class = "pln" > m</span><span class = "pun" >+</span><span class = "lit" >1</span><span class = "pun" >,</span><span class = "pln" > t</span><span class = "pun" >);</span><span class = "pln" > </span><span class = "com" > /*递归地将p[m+1…t]归并为有序的p2[m+1…t]*/ </span><span class = "pln" > </span><span class = "lit" >10.</span><span class = "pln" > </span><span class = "typ" >Merge</span><span class = "pun" >(</span><span class = "pln" >rf2</span><span class = "pun" >,</span><span class = "pln" > rf</span><span class = "pun" >,</span><span class = "pln" > s</span><span class = "pun" >,</span><span class = "pln" > m</span><span class = "pun" >+</span><span class = "lit" >1</span><span class = "pun" >,</span><span class = "pln" >t</span><span class = "pun" >);</span><span class = "pln" > </span><span class = "com" > /*将p2[s…m]和p2[m+1…t]归并到p1[s…t]*/ </span><span class = "pln" > </span><span class = "lit" >11.</span><span class = "pln" > </span><span class = "pun" >}</span><span class = "pln" > </span><span class = "lit" >12.</span><span class = "pun" >}</span><span class = "pln" > </span><span class = "lit" >13. void </span><span class = "pln" > </span><span class = "typ" >MergeSort_recursive</span><span class = "pun" >(</span><span class = "typ" >ElemType</span><span class = "pln" > </span><span class = "pun" >*</span><span class = "pln" >r</span><span class = "pun" >,</span><span class = "pln" > </span><span class = "typ" >ElemType</span><span class = "pln" > </span><span class = "pun" >*</span><span class = "pln" >rf</span><span class = "pun" >,</span><span class = "pln" > </span><span class = "kwd" > int </span><span class = "pln" > n</span><span class = "pun" >)</span><span class = "pln" > </span><span class = "lit" >14.</span><span class = "pun" >{</span><span class = "pln" > </span><span class = "com" > /*对顺序表*p 作归并排序*/ </span><span class = "pln" > </span><span class = "lit" >15.</span><span class = "pln" > </span><span class = "typ" >MSort</span><span class = "pun" >(</span><span class = "pln" >r</span><span class = "pun" >,</span><span class = "pln" > rf</span><span class = "pun" >,</span><span class = "lit" >0</span><span class = "pun" >,</span><span class = "pln" > n</span><span class = "pun" >-</span><span class = "lit" >1</span><span class = "pun" >);</span><span class = "pln" > </span><span class = "lit" >16.</span><span class = "pun" >}</span><span class = "pln" > </span> |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架