acwing 快排

前言

学习acwing的快排

快排思路

Step1:确定分界点 比如q[l]q[(l+r)/2]q[r随机,一般常用前三种,但如果数据全是相同的,一般时间复杂度会从O(nlogn)变成O(n^2),所以我们会选择随机的方法确定分界点。

Step2:调整范围 设分界点 = x,我们划分区域,<=x在分界点的左侧,>=x在分界点右侧。

划分区域的方法: 先设左索引i和右索引j。先依此i++,遇到q[i] >= x时结束,然后j--,遇到q[j] <= x时结束,然后交换swap(q[i], q[j]),继续i++ j--

Step3:递归处理左右两段

acwing785.快速排序

#include <iostream>
using namespace std;

const int N = 10e5 + 10;
int n, q[N];

void quick_sort(int q[], int l, int r) {
    if (l >= r) return;
    int i = l - 1, j = r + 1;
    int index = rand() % (r - l + 1) + l;
    int x = q[index];
    while (i < j) {
        do i++; while(q[i] < x);
        do j--; while(q[j] > x);
        if (i < j) swap(q[i], q[j]);
    }
    
    quick_sort(q, l, j);
    quick_sort(q, j + 1, r);
}

int main() {
    scanf("%d", &n);
    for (int i = 0; i < n; i++) {
        scanf("%d", &q[i]);
    }
    quick_sort(q, 0, n - 1);
    for (int i = 0; i < n; i++) {
        printf("%d ", q[i]);
    }
    return 0;
}

要想清楚,最后ij结束的位置,ij是挨着的,并且i = j + 1,所以递归那样写。

练习:786.第k个数

#include <iostream>
using namespace std;

const int N = 10e5 + 10;
int n, k, q[N];

void quick_sort(int q[], int l, int r) {
    if (l >= r) return;
    int i = l - 1, j = r + 1;
    int index = rand() % (r - l + 1) +l;
    int x = q[index];
    while (i < j) {
        do i++; while(q[i] < x);
        do j--; while(q[j] > x);
        if (i < j) swap(q[i], q[j]);
    }
    
    quick_sort(q, l, j);
    quick_sort(q, j + 1, r);
}

int main() {
    scanf("%d %d",&n, &k);
    for (int i = 0; i < n; i++) {
        scanf("%d", &q[i]);
    }
    quick_sort(q, 0, n - 1);
    printf("%d", q[k - 1]);
}
### 关于 AcWing 平台上快速幂求逆元算法实现 #### 快速幂求逆元简介 在模意义下计算乘法逆元是一个常见的需求,在许多竞赛编程题目中都会遇到。对于给定的整数 \( a \),如果存在一个整数 \( b \) 使得 \( ab ≡ 1 (\mod p)\),那么 \( b \) 就被称为 \( a \) 的模 \( p \) 下的乘法逆元。 利用费马小定理可以简化这一过程,即当 \( p \) 是质数时,\( a^{p−1}≡1(\mod p) \)[^1]。因此可以通过快速幂来高效地找到这个逆元,时间复杂度为 O(log n)[^3]。 #### Python 实现代码示例 下面展示如何通过Python编写函数`quick_pow_mod(a, k, m)`来进行快速幂运算,并基于此构建求解逆元的功能: ```python def quick_pow_mod(a, k, mod): res = 1 % mod while k: if k & 1 == 1: res = res * a % mod k >>= 1 a = a * a % mod return res def inv_mod(num, prime): """返回num关于prime取模下的逆元""" return quick_pow_mod(num, prime - 2, prime) if __name__ == "__main__": num = int(input()) prime = int(input()) print(inv_mod(num, prime)) ``` 这段代码首先定义了一个用于执行快速幂操作的方法 `quick_pow_mod()` ,接着创建了另一个方法 `inv_mod()` 来调用前者并传入参数 `(num, prime-2, prime)` 计算所需的逆元[^2]。 #### 应用场景举例 考虑这样一个具体的应用案例:假设有一个长度为 N 的数组 A[] 和一个正整数 P(P>1),现在要找出有多少种不同的子序列满足其所有元素之积对P取余的结果等于X(X<P) 。这个问题涉及到组合数学中的排列计数技巧以及使用快速幂求逆元优化性能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值