归并排序题目:
给定你一个长度为 n 的整数数列。
请你使用归并排序对这个数列按照从小到大进行排序。
并将排好序的数列按顺序输出。
输入格式
输入共两行,第一行包含整数 nn。
第二行包含 n 个整数(所有整数均在 1∼10e9范围内),表示整个数列。
输出格式
输出共一行,包含 nn 个整数,表示排好序的数列。
数据范围
1≤n≤100000
输入样例:
5
3 1 2 4 5输出样例:
.1 2 3 4 5
-
分治算法是什么
-
归并排序的分治算法:
-
归并排序基本思想:
分治算法:
分治算法的基本思想是将一个规模为N的问题分解为K个规模较小的子问题,这些子问题相互独立且与原问题性质相同。
归并排序的分治算法:
- 递归子问题
- 处理子问题
- 合并子问题
归并排序的基本思想:
- 将数组逐一分段,然后进行比较(递归)
-
merge_sort(l , mid);//递归左边 merge_sort(mid + 1, r);//递归右边
- 将分段的左右数组进行比较大小,放到另外一个数组temp[ ]数组(处理子问题)
- 将temp[ ]复制到需要归并的数组内。
完整代码 + 注释:
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 1e5+10;
int a[N],tmp[N];
void merge_sort(int a[],int l,int r){
if(l>=r) return ; //递归结束条件
int mid=l+r>>1;
//将要排序的数组分成两段
merge_sort(a,l,mid);
merge_sort(a,mid+1,r);
int k = 0,i=l,j=mid+1;
//处理子问题 将两段进行比较
while(i<=mid&&j<=r){
if(a[i]<=a[j]) tmp[k++]=a[i++];
else tmp[k++]=a[j++];
}
//防止有漏的元素没被插入
while(i<=mid) tmp[k++]=a[i++];
while(j<=r) tmp[k++]=a[j++];
for (int i = l,j=0; i <=r; i ++,j++ ){//复制数组
a[i]=tmp[j];
}
}
int main()
{
int n;
cin >> n;
for (int i = 0; i < n; i ++ ){
cin >> a[i];
}
merge_sort(a,0,n-1);
for (int i = 0; i < n; i ++ ){
cout << a[i]<<" ";
}
}
------题目来源AC-wing