【排序】归并排序

现在手写排序的同学们越来越少了,但是在一些题目中,利用手写的排序可能会让题目更加的简单。下面我会上传一些排序模板。

归并排序

归并操作的工作原理如下:

第一步:申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列

第二步:设定两个指针,最初位置分别为两个已经排序序列的起始位置

第三步:比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置

重复步骤3直到某一指针超出序列尾

将另一序列剩下的所有元素直接复制到合并序列尾

#include<iostream>
#include<cmath>
#include<cstring>
#include<algorithm>
using namespace std;
int n,a[101],b[101]; 
void y(int l,int r)
{
    int m,i,j,k;
    if (l==r)
        return;
    m=(l+r)/2;
    y(l,m);
    y(m+1,r);
    i=l;
    j=m+1;
    k=l;
    while (i<=m&&j<=r)
    {
        if (a[i]<=a[j])
        {
            b[k]=a[i];
            k++;
            i++;
        }
        else
        {
            b[k]=a[j];
            k++;
            j++;
        }
    }
    while (i<=m)
    {
        b[k]=a[i];
        k++;
        i++;
    }
    while (j<=r)
    {
        b[k]=a[j];
        k++;
        j++;
    }
    for (int i=l;i<=r;i++)
        a[i]=b[i];
    return;
}
int main()
{
    cin>>n;
    for (int i=1;i<=n;i++)
        cin>>a[i];
    y(1,n);
    for (int i=1;i<=n;i++)
        cout<<a[i]<<" ";
    return 0;
}

作者:暄妍

我的博客:http://www.cnblogs.com/zbyrainbow/

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

原文地址:https://www.cnblogs.com/zbyrainbow/p/8477587.html