算法基础课

简介: 算法基础课

算法基础课


第一章 基础算法(一)


1.快速排序——分治[O(n logn)]


①确定分界点:q[l]、q[(l+r)/2]、q[r] 、随机


②调整区间,小于x的放在x左端(无序),大于的放在右边(无序),等于左右都可


③递归处理左右两端(重复1 2,对左右两端各自继续分治)


模板:


cpp(785):


#include<iostream>
using namespace std;
const int N = 1e6 + 10;
int n;
int q[N];
void quick_sort(int q[], int l, int r)
{
    if (l >= r) return;
    int x = q[l], 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()
{
    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;
}


[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RHpbfIA0-1679153945958)(D:\照片\typora笔记\算法基础课\快速排序.png)]


2.归并排序[O(n logn)]


①确定分界点 mid = ( l + r ) / 2


②递归排序


③归并——合二为一


模板(787):


#include <iostream>
using namespace std;
const int N = 1e5 + 10;
int a[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 (i = l, j = 0; i <= r; i ++, j ++ ) q[i] = tmp[j];
}
int main()
{
    int n;
    scanf("%d", &n);
    for (int i = 0; i < n; i ++ ) scanf("%d", &a[i]);
    merge_sort(a, 0, n - 1);
    for (int i = 0; i < n; i ++ ) printf("%d ", a[i]);
    return 0;
}


3.二分查找


关于二分模板问题


1)


一个mid = (l+r)>>1


一个mid = (l+r+1)>>1


加不加1 完全取决于 l = mid 还是r = mid


l等于mid时必须+1向上取整 不然会陷入l=l的死循环


r = mid 时候不用加1 因为下一步l = r 直接会退出循环


2)


这两个模板解决的是 找>=||<=||>||< 某个数的


最左或最右的位置 但这个数不一定在二分的数组中


如果在就能准确找到


如果不在 找到的就是最接近答案的数(你要找大于等于5的第一个数)但

数组中没有5 那找到的就是6的位置(如果有6的话)


所以二分是一定有答案的


我觉得这个二分模板就是解决了我上面说的(>=||<=||>||< )这四种情况


模板(789):


#include <iostream>
using namespace std;
const int N = 100010;
int n, m;
int q[N];
int main()
{
    scanf("%d%d", &n, &m);
    for (int i = 0; i < n; i++) scanf("%d", &q[i]);
    while (m--)
    {
        int x;
        scanf("%d", &x);
        int l = 0,r = n - 1;
        while (l < r)
        {
            int mid = l + r >> 1;
            if (q[mid] >= x) r = mid;
            else l = mid + 1;
        }
        if (q[l] != x) cout << "-1 -1" << endl;
        else
        {
            cout << l << ' ';
            int l = 0, r = n - 1;
            while (l < r)
            {
                int mid = l + r + 1 >> 1;
                if (q[mid] <= x) l = mid;
                else r = mid - 1;
            }
            cout << l << endl;
        }
    }
    return 0;
}


浮点(790):


#include<iostream>
using namespace std;
int main()
{
    double x;
    cin >> x;
    double l = -100, r = 100;
    while (r - l > 1e-8)
    {
        double mid = (l + r) / 2;
        if (mid * mid * mid >= x) r = mid;
        else l = mid;
    }
    printf("%.6lf\n", l);
    return 0;
}


l > 1e-8)
{
double mid = (l + r) / 2;
if (mid * mid * mid >= x) r = mid;
else l = mid;
}


printf("%.6lf\n", l);
return 0;
}
相关文章
|
算法
【AcWing算法基础课】第五章 动态规划(未完待续)(3)
当然,一个人能够滑动到某相邻区域的前提是该区域的高度低于自己目前所在区域的高度。
107 0
|
存储 人工智能 算法
【AcWing算法基础课】第四章 数学知识(未完待续)(3)
根据下面公式来预处理出等式右边的组合数的值,那么等式左边就可以用等式右边已经算过的值来进行计算(有点像dp)。
79 0
|
人工智能 算法 BI
【AcWing算法基础课】第四章 数学知识(未完待续)(2)
从2到n枚举每个数,删掉其所有的倍数,枚举完之后,没有被删掉的数为质数。
106 0
|
人工智能 算法
【AcWing算法基础课】第一章 基础算法(部分待更)(3)
输入n个字符串(不含空格),由空格隔开。每行依次输出每个字符串。
76 0
|
算法 存储 内存技术
【AcWing算法基础课】第三章 搜索与图论(2)
特点:尽可能先向纵深方向搜索。使用stack实现。所需空间O(h)(h为深度)。不具有“最短性”。
79 0
【AcWing算法基础课】第三章 搜索与图论(2)
|
存储 人工智能 移动开发
【AcWing算法基础课】第一章 基础算法(部分待更)(2)
除法是从最高位开始算,可以正序存储,但是为了与加减乘统一,以及题目中存在四则运算时比较方便,也使用倒序存储每位信息。
124 0
|
存储 算法 C++
【AcWing算法基础课】第二章 数据结构(部分待更)(3)
路径压缩:查找时,如果还没有找到目标值的父结点时,将路径上每个点的父结点,在向上寻找过程中更新记录。
91 0
|
算法
【AcWing算法基础课】第五章 动态规划(未完待续)(1)
求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且 总价值最大 。
63 0
【AcWing算法基础课】第五章 动态规划(未完待续)(1)
|
算法 存储 内存技术
【AcWing算法基础课】第三章 搜索与图论(3)
特点:尽可能先向纵深方向搜索。使用stack实现。所需空间O(h)(h为深度)。不具有“最短性”。
108 0
【AcWing算法基础课】第三章 搜索与图论(3)
|
算法 存储 C++
【AcWing算法基础课】第三章 搜索与图论(1)
特点:尽可能先向纵深方向搜索。使用stack实现。所需空间O(h)(h为深度)。不具有“最短性”。
71 0
【AcWing算法基础课】第三章 搜索与图论(1)