专栏文章
P1177 【模板】排序 题解
P1177题解参与者 1已保存评论 0
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @minh9x5w
- 此快照首次捕获于
- 2025/12/02 02:23 3 个月前
- 此快照最后确认于
- 2025/12/02 02:23 3 个月前
sort 函数:#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 1e5 + 5;
int n, a[N];
int main()
{
cin >> n;
for (int i = 1; i <= n; i ++ ) scanf("%d", &a[i]);
sort(a + 1, a + n + 1);
for (int i = 1; i <= n; i ++ ) printf("%d ", a[i]);
return 0;
}
手写快排:理论就是每次选取一个基准值放在中间,用两两交换的方式将所有小于它的数放在左边,大于它的数放在右边。因为基准值一般是选取第一个所以如果数组本身有序就会被卡到 级别的复杂度,所以排序前需要先随机打乱。
不过还是不能通过这道题,因为本题的最后一个数据的点全部都是一样的数。所以我增加了一个判断,每次递归子区间时,都先判断一下是否有序,无序时再进行递归,这样就可以通过。
代码:
CPP#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 5;
int n, a[N];
bool check(int l, int r)
{
for (int i = l; i < r; i ++ ) if (a[i] > a[i + 1]) return 0;
return 1;
}
void sort(int l, int r)
{
if (l >= r) return;
int k = a[l], p = l + 1, q = r;
while (p <= q)
{
while (p <= q && a[p] <= k) p ++ ;
while (p <= q && a[q] >= k) q -- ;
if (p < q) swap(a[p], a[q]);
}
swap(a[l], a[q]);
if (!check(l, q - 1)) sort(l, q - 1);
if (!check(q + 1, r)) sort(q + 1, r);
}
int main()
{
cin >> n;
for (int i = 1; i <= n; i ++ ) scanf("%d", &a[i]);
random_shuffle(a + 1, a + n + 1);
sort(1, n);
for (int i = 1; i <= n; i ++ ) printf("%d ", a[i]);
return 0;
}
相关推荐
评论
共 0 条评论,欢迎与作者交流。
正在加载评论...