排序-------归并排序

题目描述:

给定你一个长度为n的整数数列。
请你使用归并排序对这个数列按照从小到大进行排序。
并将排好序的数列按顺序输出。


输入格式:

输入共两行,第一行包含整数n。
第二行包含n个整数(所有整数均在1~10^9范围内),表示整个数列。

输出格式:

输出共一行,包含n个整数,表示排好序的数列。
数据范围
1≤n≤100000


输入样例:

5
3 1 2 4 5

输出样例:

1 2 3 4 5


归并思路:

1.先找到中间点 mid = (l+r)/2
2.递归左右部分
3.通过两个指针比较大小归并合二为一

AC代码如下: 

#include

using namespace std;

const int N = 100010;
int n;
int q[N],temp[N];

void merge_sort(int q[],int l,int r)
{
    //如果数组中是1个数直接结束
    if(l>=r) return;
    //找到中间点
    int mid = (l+r) >> 1;
    //递归左右
    merge_sort(q,l,mid);
    merge_sort(q,mid+1,r);
    //定义一个k表述空数字的起点 把其放入空数组中
    int k = 0;
    //双指针
    int i = l,j=mid+1;
    while(i<=mid && j<=r)
    {
        if(q[i] < q[j]) temp[k++] = q[i++];
        else temp[k++] = q[j++];
    }
    //如果比较完还有剩余的一定是大于第一个比较完的最后一个数
    //所以直接 接到后面即可
    while(i <= mid) temp[k++] = q[i++];
    while(j <= r) temp[k++] = q[j++];
    /*这里大家可能疑惑为什么i不能是0而是l我的理解是
    因为l无论何时都是最左面,我们通过上面的双指针不
    难看出都是从最左面开始比较,所以i=l,这样递归的
    时候应该不会出错
    */
    for(int i=l,j=0;i<=r;i++,j++) q[i] = temp[j];
}

int main()
{
    scanf("%d", &n);
    for (int i = 0; i < n; i ++ ) scanf("%d ", &q[i]);
    merge_sort(q,0,n-1);
    for (int i = 0; i < n; i ++ ) printf("%d ",q[i]);
    return 0;
}

  注释上 有详细 代码 每行的意思,欢迎留言~

你可能感兴趣的:(题解,算法,数据结构,c++,排序算法)