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)依次输出元素