题目
给定你一个长度为 n的整数数列。请你使用归并排序对这个数列按照从小到大进行排序。
并将排好序的数列按顺序输出。
输入格式
输入共两行,第一行包含整数 n。
第二行包含 n 个整数(所有整数均在 1∼1091∼109 范围内),表示整个数列。
输出格式
输出共一行,包含 n个整数,表示排好序的数列。
数据范围
1≤n≤100000
输入样例:
5
3 1 2 4 5
输出样例:
1 2 3 4 5
思路
使用归并排序模版
1.确定分界点 mid
2.递归排序
3.归并-合二为一
代码
代码a(a[l + i] = temp[i])
#include <bits/stdc++.h>
using namespace std;
const int N = 100000+10;
int a[N],temp[N];
void mergeSort( int a[], int l, int r){
//递归终止条件
if(l >= r) return ;
//以mid为界限将数组分割为两部分
int mid = (r + l) >> 1;
//递归处理
mergeSort(a, l, mid);
mergeSort(a, mid+1, r);
//并--合二为一
int k = 0, i = l, j = mid + 1;
while(i <=mid && j <= r)
if(a[i] <= a[j]) temp[k++] = a[i++];
else temp[k++] = a[j++];
while(i <= mid) temp[k++] = a[i++];
while(j <= r) temp[k++] = a[j++];
for(i = l, j = 0;i <= r; i++, j++){
a[i] = temp[j];
}
}
代码b (a[i] = temp[i])
//
// main.cpp
// 归并排序-787. 归并排序
//
// Created by 小咕噜 on 2023/5/10.
//
#include <bits/stdc++.h>
using namespace std;
const int N = 100000+10;
int a[N],temp[N];
void mergeSort( int a[], int l, int r){
//递归终止条件
if(l >= r) return ;
//以mid为界限将数组分割为两部分
int mid = (r + l) >> 1;
//递归处理
mergeSort(a, l, mid);
mergeSort(a, mid+1, r);
//并--合二为一
int k = l, i = l, j = mid + 1;
while(i <=mid && j <= r)
if(a[i] <= a[j]) temp[k++] = a[i++];
else temp[k++] = a[j++];
while(i <= mid) temp[k++] = a[i++];
while(j <= r) temp[k++] = a[j++];
for(int i = l; i <= r; i++)
a[ i] = temp [ i ];
}
部分代码分析
for(i = l, j = 0;i <= r; i++, j++)
a[i] = temp[j];
将排好序的部分temp[]写回a[],使得该子序列有序,在后面还要调用这部分有序子序列,该部分代码不仅仅是最后将排好temp[]写入a[],进行输出。