归并排序的笔记
归并的简单说明
对于一组无序的数字,如何使他们乖乖站好!是经常出现的基础题,以此衍生出来的题目也非常的多,如何更快的使其排序也成为了学习的方向。冒泡排序应该是学习的第一个除函数外第一个排序方法,但其时间复杂度过大,一般都不推荐使用。所以一个更快更好的排序方法就成为了迫切的需求,随着学习,发现了快速排序和归并排序,简单对快速排序和归并排序进行对比,我们知道时间复杂度上快速排序更优,但稳定性上,归并更胜一筹。
归并排序的代码实现
归并排序的代码块主要分为两个部分,一个是将数组进行重新分组,一个是对其进行顺序上的重组即排序,最后通过递归的方式完成排序。
第一部分对数组进行重新分组
void merge(int l,int r)
{
if(l<r)
{
int mid = (l + r)/2;
merge(l,mid);
merge(mid+1,r);
}
}
第二部分对分好的数组进行排序
void mergesort(int l,int r,int mid)
{
int a[],b[];
int i = l,j = mid + 1,h = 0;
while(i<=mid&&j<=r)
{
if(a[i]>a[j])
{
b[h] = a[j];
h ++;
j ++;
}
else
{
b[h] = a[i];
h ++;
i ++;
}
}
while(i <= mid) b[h] = a[i],h ++,i ++;
while(j <= r) b[h] = a[j],h ++,j ++;
int t = l;
h = 0;
while(t <= r) a[t] = b[h],t ++,h ++;
}
第三部分将其用一个函数的方式书写出来,或者用两个函数分别书写
方法一用一个方式书写
#include <bits/stdc++.h>
using namespace std;
const int N = ***;
int a[N],b[N];
void mergesort(int l,int r)
{
if(l == r) return;
int mid = (l + r)/2;
if(l<r)
{
mergesort(l,mid);
mergesort(mid+1,r);
}
int i = l,j = mid + 1,h = 0;
while(i<=mid&&j<=r)
{
if(a[i]>a[j])
{
b[h] = a[j];
h ++;
j ++;
}
else
{
b[h] = a[i];
h ++;
i ++;
}
}
while(i <= mid) b[h] = a[i],h ++,i ++;
while(j <= r) b[h] = a[j],h ++,j ++;
int t = l;
h = 0;
while(t <= r) a[t] = b[h],t ++,h ++;
}
int main()
{
int n;
cin >> n;
for(int i = 1;i <= n;i ++) cin >> a[i];
mergesort(1,n);
for(int i = 1;i <= n;i ++)cout << a[i] << " ";
}
方法二用两个函数分别书写
#include <bits/stdc++.h>
using namespace std;
int n;
const int N = ***;
int a[N],b[N];
void mergesort(int l,int r,int mid)
{
int i = l,j = mid + 1,h = 0;
while(i<=mid&&j<=r)
{
if(a[i]>a[j])
{
b[h] = a[j];
h ++;
j ++;
}
else
{
b[h] = a[i];
h ++;
i ++;
}
}
while(i <= mid) b[h] = a[i],h ++,i ++;
while(j <= r) b[h] = a[j],h ++,j ++;
int t = l;
h = 0;
while(t <= r) a[t] = b[h],t ++,h ++;
}
void merge(int l,int r)
{
if(l<r)
{
int mid = (l + r)/2;
merge(l,mid);
merge(mid+1,r);
mergesort(l,r,mid);
}
}
int main()
{
cin >> n;
for(int i = 1;i <= n;i ++) cin >> a[i];
merge(1,n);
for(int i = 1;i <= n;i ++)cout << a[i] << " ";
}
归并排序的例题(暂时就两个,凑合用)这里都是acwing里的免费题
awcing 789 .归并排序
awcing 65. 归并排序求逆序数对