c++ 归并排序

c/c++

浏览数:130

2019-7-24

AD:资源代下载服务

c++ 归并排序

输入输出格式

输入格式:

第11行为一个正整数NN,第22行包含NN个空格隔开的正整数a_ia
i
​ ,为你需要进行排序的数,数据保证了A_iA
i
​ 不超过10000000001000000000。

输出格式:

将给定的NN个数从小到大输出,数之间空格隔开,行末换行且无空格。

输入输出样例

输入样例#1:

8
10 4 6 3 8 2 5 7

输出样例#1:

2 3 4 5 6 7 8 10

代码及注释

#include <bits/stdc++.h>
using namespace std;
int a[100];
int r[100];
void Sort(int L,int R)
{
    if (L == R)//如果只有一个元素
        return ;//退出
    else
    {
        int mid = (L + R) / 2;//计算出中间值
        Sort(L,mid);//拆分mid前面的
        Sort(mid + 1,R);//拆分mid后面的
/***************对左右两个有序数组合并****************************/
        int k = L;
        int i = L;
        int j = mid + 1;
        while (i <= mid && j <= R)//进行逐个遍历
        {
            if (a[i] <= a[j])//如果左边比右边大
            {
                r[k] = a[i];//把小的排在前面
                k ++;
                i ++;
            }
            else//如果右边比左边大
            {
                r[k] = a[j];//把小的排在前面
                k ++;
                j ++;
            }
        }
        while (i <= mid)//如果还有剩余,就直接复制到r[]
        {
            r[k] = a[i];
            i ++;
            k ++;
        }
        while (j <= R)//如果还有剩余,就直接复制到r[]
        {
            r[k] = a[j];
            j ++;
            k ++;
        }
        for (int i = 1;i <= R;i ++)//把r[]全部赋值给a[]
        {
            a[i] = r[i];
        }
    }
}
int main()
{
    int n;
    cin >> n;
    for (int i = 1;i <= n;i ++)
    {
        cin >> a[i];
    }
    Sort(1,n);//调用
    for (int i = 1;i <= n;i ++)
    {
        cout << a[i] << " ";
     } 
    return 0;
 } 

思路

1)输入你要排序的数
2)把这些数字拆分拆分拆分,到不能拆分为止
3)合并这些元素,合并时那个小就把那个放上去
4)依次输出元素

作者:牛大了的牛大