归并排序
思路:分治处理每段
例如: 数组 3 1 2 4 5
分治为两段有序的序列
1 3 5
2 4
逐个比较把最小的数放入新数组
第一个放 1 第二个 1 2 第三个 1 2 3 第四个 1 2 3 4 此时第二列没有了就把第一列剩余的放入新数组 1 2 3 4 5 则排好~
代码思路:
其实就是细分到一个数进行上面的比较
假定3 1 2 4 5 会被递归分成 3 1 和 2 4 5
然后 3 1 排好为 1 3
2 4 5 排好不变
然后两段比较并放入新数组,最后再放回原数组即可。
题目
给定你一个长度为 n 的整数数列。
请你使用归并排序对这个数列按照从小到大进行排序。
并将排好序的数列按顺序输出。
输入格式
输入共两行,第一行包含整数 n。
第二行包含 n 个整数(所有整数均在 1∼109 范围内),表示整个数列。
输出格式
输出共一行,包含 n 个整数,表示排好序的数列。
数据范围
1≤n≤100000
输入样例:
5
3 1 2 4 5
输出样例:
1 2 3 4 5
代码
#include <iostream>
using namespace std;
const int N = 100010;
int q[N] , tem[N];
void merge_sort(int *q , int l , int r){
//递归出口
if(l >= r)
return ;
//找中点作为分界线
int mid = l + r >> 1;
//先递归分到最细----再比较并排好每一段---出栈---再再排一段----再出栈----....----最后排好
merge_sort(q , l , mid);
merge_sort(q , mid + 1 , r);
int k = 0 , i = l , j = mid + 1;
while(i <= mid && j <= r){
if(q[i] <= q[j])
tem[k++] = q[i++];
else
tem[k++] = q[j++];
}
while(i <= mid)
tem[k++] = q[i++];
while(j <= r)
tem[k++] = q[j++];
for(int i = l , k = 0 ; i <= r ; i ++ , k ++ )
q[i] = tem[k];
}
int main(){
int n;
cin >> n;
for(int i = 0 ; i < n ; i ++ )
cin >> q[i];
merge_sort(q , 0 , n - 1);
for(int i = 0 ; i < n ; i ++ )
cout << q[i] << " ";
return 0;
}