IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> 第一章 基础算法 -> 正文阅读

[C++知识库]第一章 基础算法

基础算法(一)

快速排序

void quick_sort(int q[], int l, int r)
{
    if (l >= r) return;

    int i = l - 1, j = r + 1, x = q[l + r >> 1];//i,j指针取左右两端的两侧,因为后面要直接加1
    while (i < j)//知道>=为止
    {
        do i ++ ; while (q[i] < x);
        do j -- ; while (q[j] > x);
        if (i < j) swap(q[i], q[j]);//swap是交换两个数
    }
    quick_sort(q, l, j), quick_sort(q, j + 1, r);//这里j是习惯问题,不要改了,如果前面取的是x=q[l]或者x=q[r]会有边界问题死循环,还要处理,但是前面取x = q[l + r >> 1]就没什么事了。
}

[平均的]时间复杂度: O ( n l o g n ) O(n log n) O(nlogn) (以2为底的 l o g n logn logn)
[最坏]时间复杂度: O ( n 2 ) O(n^2) O(n2)
快排的期望是 n / 2 n/2 n/2,递归的层数的期望是 l o g 2 n log2n log2n层,所以平均的时间复杂度: O ( n l o g n ) O(n log n) O(nlogn)

归并排序

注意快排和递归的区别,快排是先排序再递归两边,递归是先递归再排序之类的其他操作

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;//i指向左半边的起边,j指向右半边的起点
    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 ++ ];
//把临时数组里面的元素存回q[]里面去
    for (i = l, j = 0; i <= r; i ++, j ++ ) q[i] = tmp[j];
}

时间复杂度: O ( n l o g n ) O(n log n) O(nlogn) (以2为底的 l o g n logn logn)
归并排序的递归树,树种每层元元素的个数最多是n,也就代表着每层最多进行n次比较,而递归树最多只有log2n层(n除以log2n次就除为1了),合在一起就是 n l o g 2 n nlog2n nlog2n了。
在这里插入图片描述

整数二分

很好的二分查找解释的视频:https://www.bilibili.com/video/BV1d54y1q7k7?from=search&seid=7982797064148706619
C++的库函数
在这里插入图片描述



y总的
有单调性一定可以二分,没有单调性有可能也可以二分,

bool check(int x) {/* ... */} // 检查x是否满足某种性质

// 区间[l, r]被划分成[l, mid]和[mid + 1, r]时使用:
int bsearch_1(int l, int r)
{
    while (l < r)
    {
        int mid = l + r >> 1;
        if (check(mid)) r = mid; // check()判断mid是否满足性质
        else l = mid + 1;
    }
    return l;
}
// 区间[l, r]被划分成[l, mid - 1]和[mid, r]时使用:
int bsearch_2(int l, int r)
{
    while (l < r)
    {
        int mid = l + r + 1 >> 1;
        if (check(mid)) l = mid;
        else r = mid - 1;
    }
    return l;
}

浮点数二分

bool check(double x) {/* ... */} // 检查x是否满足某种性质

double bsearch_3(double l, double r)
{
    const double eps = 1e-6;   // eps 表示精度,取决于题目对精度的要求,如果要保留4位小数,这里写1e-6,如果要保留6位小数,这里写1e-8,要始终比要求高两位小数
    while (r - l > eps)
    {
        double mid = (l + r) / 2;
        if (check(mid)) r = mid;
        else l = mid;
    }
    return l;
}
  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-08-07 11:49:05  更:2021-08-07 11:51:17 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/9 6:11:43-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码