数据结构及算法——归并排序
作者:互联网
一、归并排序的思想
其原理是假设初始序列含有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] << " ";
}
标签:归并,排序,int,SR,void,MSort,序列,数据结构 来源: https://blog.csdn.net/cyllsy/article/details/117201125