题目地址:
https://www.acwing.com/problem/content/820/
给定一个长度为
n
n
n的数组
a
a
a以及两个整数
l
l
l和
r
r
r,请你编写一个函数,void sort(int a[], int l, int r)
,将
a
[
l
]
∼
a
[
r
]
a[l]∼a[r]
a[l]∼a[r]从小到大排序。输出排好序的数组
a
a
a。
输入格式:
第一行包含三个整数
n
n
n,
l
l
l,
r
r
r。第二行包含
n
n
n个整数,表示数组
a
a
a。
输出格式:
共一行,包含
n
n
n个整数,表示排序完成后的数组
a
a
a。
数据范围:
0
≤
l
≤
r
<
n
≤
1000
0≤l≤r<n≤1000
0≤l≤r<n≤1000
可以用归并排序。代码如下:
#include <iostream>
using namespace std;
const int N = 1010;
int a[N];
int n, l, r;
void sort(int a[], int l, int r) {
if (l >= r) return;
static int tmp[N] = {0};
int mid = l + (r - l >> 1);
sort(a, l, mid), sort(a, mid + 1, r);
int i = l, j = mid + 1, idx = l;
while (i <= mid && j <= r)
if (a[i] <= a[j]) tmp[idx++] = a[i++];
else tmp[idx++] = a[j++];
while (i <= mid) tmp[idx++] = a[i++];
while (j <= r) tmp[idx++] = a[j++];
for (int k = l; k <= r; k++) a[k] = tmp[k];
}
int main() {
scanf("%d%d%d", &n, &l, &r);
for (int i = 0; i < n; i++) scanf("%d", &a[i]);
sort(a, l, r);
for (int i = 0; i < n; i++) printf("%d ", a[i]);
puts("");
return 0;
}
时间复杂度 O ( n + ( r − l ) log ( r − l ) ) O(n+(r-l)\log (r-l)) O(n+(r−l)log(r−l)),空间 O ( n ) O(n) O(n)。