数据结构及算法——归并排序
2021/5/23 22:55:15
本文主要是介绍数据结构及算法——归并排序,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
一、归并排序的思想
其原理是假设初始序列含有n个记录,则可以将n个记录看成是n个有序的子序列,每个子序列长度为1,然后两两进行归并,得到[n/2](即不小于n/2的最小整数)个长度为2或者1(当序列的元素为奇数个时最后可能存在一个单独的子序列)的有序子序列;再进行两两归并,如此重复,直到得到一个长度为n的有序序列为止,此排序方法称作为2路归并排序。
二、归并排序代码(来源于大话数据结构)
#include <iostream> #include <initializer_list> #define MAXSIZE 10 typedef int Status; struct SqList { int r[MAXSIZE+1]= {0, 1, 5, 8, 3, 10, 9}; int length = 6; }; void Merge(int *SR, int *TR, int i, int m, int n); //将数组SR归并为TR void MSort(int *SR, int *TR1, int s, int t); //将数组SR中的关键字归并到TR1中 void MergeSort(SqList &L) { MSort(L, L, 1, L.length); } void MSort(int *SR, int *TR1, int s, int t) { int m; int TR2[MAXSIZE+1]; //中间辅助数组,此处每次递归都会创建数组,造成空间浪费,更好的实现方法参见b站浙大数据结构视频中的讲解 if(s==t) TR[s] = SR[s]; else { m = (s+t)/2; MSort(SR, TR2, s, m); MSort(SR, TR2, m+1, t); Merge(TR2, TR1, s, m, t); } } void Merge(int *SR, int *TR, int i, int m, int n) { int j, k, l; //三个指针,分别指向两个子序列中待比较关键字的位置以及目标数组中待放入关键字的位置 for(k=i, j=m+1; i<=m && j<=n; ++k) { if(SR[i]<SR[j]) TR[k] = SR[i++]; else TR[k] = SR[j++]; } if(i<=m) for(l=0; l<=m-i; ++l) TR[k+l] = SR[i+l]; if(j<=n) for(l=0; l<=n-j; ++l) TR[k+l] = SR[j+l]; } int main() { SqList L; MergeSort(L); for(int i=1; i<=L.length; ++i) std::cout << L.r[i] << " "; }
这篇关于数据结构及算法——归并排序的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-23Springboot应用的多环境打包入门
- 2024-11-23Springboot应用的生产发布入门教程
- 2024-11-23Python编程入门指南
- 2024-11-23Java创业入门:从零开始的编程之旅
- 2024-11-23Java创业入门:新手必读的Java编程与创业指南
- 2024-11-23Java对接阿里云智能语音服务入门详解
- 2024-11-23Java对接阿里云智能语音服务入门教程
- 2024-11-23JAVA对接阿里云智能语音服务入门教程
- 2024-11-23Java副业入门:初学者的简单教程
- 2024-11-23JAVA副业入门:初学者的实战指南