[AcWing] 算法基础课(一)学算法强推哦

第一讲 基础算法


本文题目及代码全部来自AcWing,强推!
(因为没有接触过C++所以一开始学起来不是很容易,慢慢听下去边查边学就好啦)

文章目录

  • 第一讲 基础算法
    • 1. 排序
      • 1.1 快速排序
      • 1.2 归并排序
    • 2. 二分
      • 2.1 整数二分(较麻烦)
      • 2.2 浮点数二分
    • 3. 前缀和与差分
      • 3.1 前缀和
      • 3.2 差分
    • 4. 双指针
    • 5. 位运算
    • 6. 离散化
    • 7. 区间合并

1. 排序

1.1 快速排序

快速排序基础算法:

题目:

[AcWing] 算法基础课(一)学算法强推哦_第1张图片

#include 
using namespace std;

const int N = 1000010;

int n;
int q[N];

void quick_sort(int q[], int l, int r)
{
   
    if (l >= r) return ;
    
    int x = q[l + r >> 1], i = l - 1, j = r + 1;
    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()
{
   
    cin >> n;
    for (int i = 0; i < n; i ++) cin >> q[i];
    
    quick_sort(q, 0, n-1);
    
    for (int i = 0; i < n; i ++) cout << q[i] << ' ';
    
    return 0;
}

思路:

  • 确定分界点x,定义双指针i在最左边,j在最右边;
  • 按照单调性分成两个区间,分界点左边为小于等于x的,右边为大于等于x的
  • 递归排序左边,递归排序右边

注意:

  • 指针都要往外扩一位,因为先做了++操作;
  • 边界问题,这里x的取值与后面递归用i还是j有直接关系,保险起见取中间值l + r >> 1,向右进位1表示除以2;

第k个数

题目:

[AcWing] 算法基础课(一)学算法强推哦_第2张图片

#include 
using namespace std;

const int N = 1000010;

int n, k;
int q[N];

int quick_sort(int l, int r, int k)
{
   
    if (l == r) return q[r];
    
    int x = q[l + r >> 1], i = l - 1, j = r + 1;
    while (i < j)
    {
   
        do i ++; while (q[i] < x);
        do j --; while (q[j] > x);
        if (i < j) swap(q[i], q[j]);
    }
    
    int s1 = j - l + 1;
    if (s1 >= k) quick_sort(l, j, k);
    else quick_sort(j + 1, r, k - s1);
}

int main()
{
   
    cin >> n >> k;
    for (int i = 0; i < n ; i ++) cin >> q[i];
    
    cout << quick_sort(0, n-1, k) << ' ';
    
    return 0;
}

思路:

  • 与快排模版相同;
  • 这里会多出一个s1用来判断第k个数在哪个区间中

注意:

  • 因为j作为分界点,所以用j-i+1来判断k在左半区间还是在右半区间;
  • 当l=r的时候即找出夹出来的第k个数返回即可

1.2 归并排序

归并排序基础算法

题目:
[AcWing] 算法基础课(一)学算法强推哦_第3张图片

#include
using namespace std;

const int N = 1000010;

int n;
int q[N], tmp[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]) tmp[k ++] = q[i ++];
        else tmp[k ++] = q[j ++];
    }
    while (i <= mid) tmp[k ++] = q[i ++];
    while (j <= r) tmp[k ++] = q[j ++];
    
    for (int i = l, j = 0; i <= r; i ++, j ++) q[i] = tmp[j];
}

int main()
{
   
    scanf("%d"

你可能感兴趣的:(算法,算法,leetcode,数据结构)