首页 > 编程语言 >基础算法学习笔记

基础算法学习笔记

时间:2022-12-12 18:13:33浏览次数:78  
标签:do 递归 int qsort while 笔记 学习 算法 排序

#笔记-基础算法

快速排序

将序列按从小到大或从大到小顺序排序。

时间复杂度 \(O(nlogn)\),不稳定。

步骤

  1. 确定分界点 \(x\):\(q[l]\)、\(q[(l + r) \div 2]\),\(q[r]\)、\(q[(l +r+1)\div 2]\)。

    注意,上面分界点用列举的前两项时,递归处理 qsort(l, j); qsort(j + 1, r);反之递归处理 qsort(l, i); qsort(i + 1, r)。否则会有边界问题(举序列中只有两个数的情况思考)。

  2. 调整区间:两个指针 \(i,j\) 往中心移动,左边遇到 \(\ge x\) 的数时停下,右边遇到 \(\le x\) 的数停下,再交换。

    为什么不是“左边遇到 \(> x\) 的数时停下,右边遇到 \(< x\) 的数停下”呢?
    -注意序列中所有数相同的情况。

  3. 递归求解左右两段。

    不难得出,当 \(i \ge j\) 时,\(i\) 左边都为 \(\le x\) 的数,\(j\) 右边都为 \(\ge x\) 的数,故分两段递归即可。具体细节见上文。

代码如下:

void qsort(int l, int r) {
    if(l >= r) return;
    int x = a[(l + r) / 2], i = l - 1, j = r + 1;
    while(i < j) {
        do i++; while(a[i] < x);
        do j--; while(a[j] > x);
        if(i < j) swap (a[i], a[j]);
    }
    qsort(l, j); qsort(j + 1, r);
}

例题

acwing786 第k个数

思路1:将原数组 \(a\) 排序后输出 \(a[k]\) 即可。排序可 sort(),也可手写。时间复杂度 \(O(nlogn)\)。

思路2:看向快排模板。

快排分段递归时,我们拿到了数组分界点的指针。因此,我们只需要在两段中选择 \(k\) 在内的一段进行递归排序即可。

时间复杂度计算 \(O(n + \frac{n}{2} + \frac{n}{4} + \dots) < O(2n) = O(n)\)。

void qsort(int l, int r) {
    if(l >= r) return;
    int x = a[(l + r) / 2], i = l - 1, j = r + 1;
    while(i < j) {
        do i++; while(a[i] < x);
        do j--; while(a[j] > x);
        if(i < j) swap (a[i], a[j]);
    }
    if(k <= j) qsort(l, j); else qsort(j + 1, r);
}

标签:do,递归,int,qsort,while,笔记,学习,算法,排序
From: https://www.cnblogs.com/Running-a-way/p/basic_algorithm.html

相关文章

  • 算法基础课
    给定一个字符串SS,以及一个模式串PP,所有字符串中只包含大小写英文字母以及阿拉伯数字。模式串PP在字符串SS中多次作为子串出现。求出模式串PP在字符串SS中所有......
  • XCNP学习笔记
    XCNP学习笔记2022H12-821  HCIP-Datacom-CoreTechnology题库笔记2、IS-IS中地址的总长度最少为8bit,最大为20bit3、Stub区域:该区域不允许4、5类LSA,但允许1、2、3类LS......
  • HanLP Demo(学习笔记)
    需求,实习需要学习这个。感觉蛮好玩的.....我是这样做的:根据网上的资料,自己整理,因为是开源的,所以配合Demo理解,不是算法层次的,嗯,更新中....data包没下载下来,家里这边网不支持......
  • 《Spring Boot+Vue全栈开发实战》读书笔记
    写在前面嗯,回家处理一些事,所以离职了,之前的公司用开源技术封装了一套自己的低代码平台,所以之前学的springBoot之类的东西都忘了很多,蹭回家的闲暇时间复习下。笔记整体以Sp......
  • 数据库连接池+jdbc框架commons-dbutils 学习笔记
    嗯,看到一个javaweb项目用到这些知识,就准备整理,嗯,我并没有敲代码。加油生活。愿我自己。                          ......
  • 《软件工程导论》学习笔记·
    嗯,软件工程的笔记是上课做的,发现有小伙伴收藏,很开心,这里列出上学时的笔记,有些是课堂笔记,有些是图书馆刷书的笔记,电子档的笔记后面都有资源,生活加油,天天开心,^_^​​《Oracle......
  • BPMN 2.0学习笔记 (基于Activiti实践学习笔记)
    写在前面推荐学习网站:​​http://www.mossle.com/docs/activiti/index.html#bpmn20​​摘一句:生活就是个缓慢受锤的过程,人一天天老下去,奢望也一天天消失,最后变得像挨了锤......
  • 温州大学《深度学习》课程课件(十、人脸识别与神经风格迁移)
    这学期我上的另一门课是本科生的《深度学习》,主要用的是吴恩达老师的《深度学习》视频课的内容。使用教材:吴恩达《深度学习》课程笔记课外参考书:《深度学习》,人民邮电出版社......
  • 温州大学《深度学习》课程课件(八、深度卷积神经网络)
    这学期我上的另一门课是本科生的《深度学习》,主要用的是吴恩达老师的《深度学习》视频课的内容。使用教材:吴恩达《深度学习》课程笔记课外参考书:《深度学习》,人民邮电出版社......
  • UE4 GAS插件入门学习记录1——初步认识及使用
    ​引言本系列文章内容仅为个人学习记录,使用UE的版本为4.27,如有侵权请联系我学习来源及各参考文档:GASDocumentation_Chinese原文地址:tranek/GASDocumentation翻译地......