787. 归并排序

目录

链接

题目

题意 

思路

代码

图片

句子 


链接

原题链接

题目

给定你一个长度为 nn 的整数数列。

请你使用归并排序对这个数列按照从小到大进行排序。

并将排好序的数列按顺序输出。

输入格式

输入共两行,第一行包含整数 nn。

第二行包含 nn 个整数(所有整数均在 1∼1091∼109 范围内),表示整个数列。

输出格式

输出共一行,包含 nn 个整数,表示排好序的数列。

数据范围

1≤n≤1000001≤n≤100000

输入样例:

5
3 1 2 4 5

输出样例:

1 2 3 4 5

题意 

使用归并排序把数组里面的元素从小到大进行排列

思路

分治的思想。

1.先把元素分成两个部分,不断递归,从而实现排序,就是每一个部分内部都是排好序的

2.使用双指针算法,把已经排好顺序的两个部分合二为一

3.双指针算法:定义两个指针,i,j,因为两个部分已经是排好顺序的,所以其实只要比较两个元素就可以知道排列顺序,然后不断移动指针位置就可以实现合二为一。

(1)只要q[i]<=q[j],就把q[i]放进答案数组

(2)否则把q[j]放进答案数组

(3)这两个部分很可能不是同时用完的,所以当其中一个部分使用完之后,直接把另一个部分接在答案数组的后面就行

(4)把答案数组里面的元素放回q[]数组

代码

#include
using namespace std;
const int N=1e5+10;
int q[N];
int temp[N];
void merge_sort(int q[],int l,int r)
{
    if(l>=r)
    {
        return;
    }
    int x=(l+r)/2;
    merge_sort(q,l,x);
    merge_sort(q,x+1,r);
    int k=0,i=l,j=x+1;
    while(i<=x&&j<=r)
    {
        if(q[i]<=q[j])
        {
            temp[k++]=q[i++];
        }
        else
        {
            temp[k++]=q[j++];
        }
    }
    while(i<=x)
    {
        temp[k++]=q[i++];
    }
    while(j<=r)
    {
        temp[k++]=q[j++];
    }
    for(int i=l,j=0;i<=r;i++,j++)
    {
        q[i]=temp[j];
    }
}
int main()
{
    int n;
    cin>>n;
    for(int i=0;i>q[i];
    }
    merge_sort(q,0,n-1);
    for(int i=0;i

图片

787. 归并排序_第1张图片

 

句子 

零抓紧发射闸,神色平静:“赌一把咯。”《龙族》

你可能感兴趣的:(算法竞赛,算法)