版权声明:随便写写,也不重要,欢迎挑错讨论 https://blog.csdn.net/qq_37305947/article/details/79858149
觉得这一部分还是比较基础比较重要所以看完了还耽搁了两天才返回来写一下总结的博客。。。(其实是又懒有嫌麻烦再加上打了(挂机)两场比赛 ,做题体验很差,就很影响心情。因为我又不知道我现在做的这些是不是又是“无用功”了....)
7.1归并排序
伪代码
meger (A,l,r,m)
n1=m-l
n2=r-m
L[0...n1],R[0...n2]
for i=0 to n1-1
L[i]=A[l+i]
for i=0 to n2-1
R[i]=A[m+i]
L[n1]=INFTY
R[n2]=INFTY
i=0,j=0
for k=l to r-1
if L[i] <= R[j]
A[k]=L[i++]
else
A[k]=R[j++]
M_sort(A,l,r)
if l+1<r
mid=(l+r)/2
M_sort(A,l,m)
M_sort(A,m,r)
merge(A,l,m,r)
书上的讲解还是太麻烦了,简单一点来讲(自己认为的并不知道正确与否)emm,归并排序就是先将体积庞大的无序的数组平均拆成两个有序的数组,然后两个数组再分别继续拆成两个有序数组直至最小的数组中只有一个元素。然后将已经排序好的有序数组合并“整合”起来成为一个数组。(这就是传说中的递归思想?)
实现代码:
ll merge(ll a[],ll l,ll r,ll m){
ll n1=m-l;
ll n2=r-m;
for(ll i=0;i<n1;i++) L[i]=a[l+i];
for(ll i=0;i<n2;i++) R[i]=a[m+i];
L[n1]=INF; R[n2]=INF;
ll i=0,j=0;
for(ll k=l;k<r;k++){
ans++;
if(L[i]<=R[j]){
a[k]=L[i++];
}
else {
a[k]=R[j++];
}
}
return ans;
}
void msort(ll a[],ll l,ll r){
if(l+1<r){
ll m=(l+r)/2;
msort(a,l,m);
msort(a,m,r);
merge(a,l,r,m);
}
return ;
}
归并排序的时间复杂度为O(nlogn) 高效且稳定