几种常用的排序方法4--归并排序
归并排序
归并排序,又称为合并排序,它是把待排序序列分为若干个子序列,每个子序列是有序的,然后再把有序子序列合并为整体有序序列。
使用的D&C的思想:
分解:将n个元素分解为各含n/2个元素的子序列;
解决:用合并排序法对两个子序列进行递归的排序;
合并:合并两个已经排好的子序列以得到正确结果。
归并排序的速度仅次于快速排序,为稳定排序算法,一般用于对总体无序,但是各子项相对有序的数列。其最好,最坏,平均时间复杂度都是O(nlogn)。
1 void Merge(int A[], int p, int q, int r)//对两个已经排好序的子数列进行合并 2 { 3 int n1 = q - p + 1;//第一个子数列长度 4 int n2 = r - q; //第二个子数列长度 5 int L[n1+1], R[n2+1]; //左右两个子数列 6 for(int i = 1; i <= n1; i++) 7 { 8 L[i] = A[p+i-1]; //初始化 9 } 10 for(int j = 1; j <= n2; j++) 11 { 12 R[j] = A[q+j]; //初始化 13 } 14 L[n1+1] = MAXN;//哨兵值,前面定义MAXN为一个很大的数 15 R[n2+1] = MAXN;//使用这个哨兵值是为了避免检查每个子序列是不是空的。所有的数都不会比它大 16 int i = 1; 17 int j = 1; 18 for(int k = p; k <= r; k++)//有序的分别将小的数重新插入元序列中 19 { 20 if(L[i]<= R[j]) 21 { 22 A[k] = L[i]; 23 i = i + 1; 24 } 25 else 26 { 27 A[k] = R[j]; 28 j = j + 1; 29 } 30 } 31 } 32 33 void Merge_Sort(int A[], int p, int r) 34 { 35 if(p < r) 36 { 37 int q = (int)((p+r)/2); //折半分解序列 38 Merge_Sort(A,p,q); //对左半部分进行归并排序 39 Merge_Sort(A,q+1,r); //对右半部分进行归并排序 40 Merge(A,p,q,r); 41 } 42 }
【推荐】2025 HarmonyOS 鸿蒙创新赛正式启动,百万大奖等你挑战
【推荐】博客园的心动:当一群程序员决定开源共建一个真诚相亲平台
【推荐】开源 Linux 服务器运维管理面板 1Panel V2 版本正式发布
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 独立开发,这条路可行吗?
· 我在厂里搞 wine 的日子
· 如何通过向量化技术比较两段文本是否相似?
· 35+程序员的转型之路:经济寒冬中的希望与策略
· JavaScript中如何遍历对象?
· 独立开发,这条路可行吗?
· C#源生成器:让你的代码飞起来的黑科技
· Java简历、面试、试用期、转正
· Java开发AI项目,太爽了!LangChain4j保姆级教程
· 极大提高项目部署的生产力!分享一个半自动化的CICD实现方案