数组 容器 递归 普通排序 线性排序

这篇具有很好参考价值的文章主要介绍了数组 容器 递归 普通排序 线性排序。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

《数据结构与算法之美》读书笔记

写在前面

这本书的大部分内容比较浅显,因此只挑DSAA课程上没有涉及或没有深入讨论的点总结

第二章

数组相关

  1. 提高传统数组插入/删除数据效率的方法:

    • 如果插入的数据不要求有序,可以直接把某位的原数据替换成新数据,然后把原数据放到数组末尾,避免大面积的数据移动。
    • 删除时不用一个一个删,可以先把要删的元素一个个标记好,等到数组中没有更多的存储空间时一并集中删除。
  2. 警惕C语言中数组访问越界的问题,通过内存公式计算出的内存地址是可用的,即便越界,程序也可能不报任何错。

  3. 容器(ArrayList/vector)VS 传统数组:

    • 容器好用,上手快,封装性强,但有时需要装箱拆箱,存在性能损失。
    • 插入数据时的扩容操作隐藏了复杂度,一行操作可能实际上远远不止。
    • 对于底层的开发,性能优化需要做到极致,数组优于容器。

C和Java数组的实现方式

  • C/C++的多维数组也是从前往后连续存储,Java则是存储对象的引用。

  • JavaScript根据存储内容动态选择存储结构,可利用ArrayBuffer进行底层开发。

第三章

递归

  1. 堆栈溢出不一定是死循环,可能是递归太深,栈装不下了。

  2. 递归时常常会不小心重复计算,可以使用哈希表等事先检测是否已求解过。

  3. 尾递归可避免堆栈溢出,但在实际软件开发中并没有多大用途。

排序

  1. 稳定排序与非稳定排序:稳定排序保持相同元素相对顺序不变。

  2. 归并排序虽稳定但空间复杂度高,通常不如快速排序实用。

  3. 线性排序:

    • 桶排序:适用于数据易于划分成若干个桶的场景,需注意内存占用和数据范围。

    • 计数排序:桶内数据相同,适用于高考分数等场景,注意处理负数和时间复杂度。

    • 基数排序:要求每位排序使用稳定排序算法,时间复杂度近似O(n)。文章来源地址https://www.toymoban.com/news/detail-825352.html

到了这里,关于数组 容器 递归 普通排序 线性排序的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 排序算法:归并排序(递归和非递归)

    朋友们、伙计们,我们又见面了,本期来给大家解读一下有关排序算法的相关知识点,如果看完之后对你有一定的启发,那么请留下你的三连,祝大家心想事成! C 语 言 专 栏: C语言:从入门到精通 数据结构专栏: 数据结构 个  人  主  页 : stackY、 ​ 目录 1.归并排序

    2024年02月07日
    浏览(40)
  • 排序算法:快速排序(三种排序方式、递归和非递归)

    朋友们、伙计们,我们又见面了,本期来给大家解读一下有关排序算法的相关知识点,如果看完之后对你有一定的启发,那么请留下你的三连,祝大家心想事成! C 语 言 专 栏: C语言:从入门到精通 数据结构专栏: 数据结构 个  人  主  页 : stackY、 目录 前言: 1.快速排

    2024年02月09日
    浏览(39)
  • 集合list排序,普通排序,stream(单属性、多属性)排序

    1、list基本类型 1.1 Collections.sort排序 1.2 list.sort排序 1.3 list.stream()排序 2、list对象 List类 list = new ArrayList(); 2.1 单属性排序(升序) list.stream().sorted(Comparator.comparing(类::属性一)); 2.2 单属性排序(降序) list.stream().sorted(Comparator.comparing(类::属性一).reversed()); //先以属性一升序,而后

    2024年02月16日
    浏览(44)
  • 快速排序的非递归实现、归并排序的递归和非递归实现、基数排序、排序算法的时间复杂度

    我们使用一个栈来模拟函数的递归过程,这里就是在利用栈分区间。把一个区间分为 [left,keyi-1][key][keyi+1,right]递归下去,直至区间不存在或left right。 如图所示: 先把整体的区间压进去,然后出栈,处理完毕后找到keyi再分为左右两个区间。然后往栈里压有区间,压左区间,就

    2024年02月17日
    浏览(51)
  • 快速排序、希尔排序、归并排序、堆排序、插入排序、冒泡排序、选择排序(递归、非递归)C语言详解

    1.排序的概念及其运用 1.1排序的概念 排序 :所谓排序,就是使一串记录,按照其中的某个或某些的大小,递增或递减的排列起来的操作。 稳定性 :假定在待排序的记录序列中,存在多个具有相同的的记录,若经过排序,这些记录的相对次序保持不变,即在原序

    2024年02月03日
    浏览(50)
  • 算法 数据结构 递归插入排序 java插入排序 递归求解插入排序算法 如何用递归写插入排序 插入排序动图 插入排序优化 数据结构(十)

    1. 插入排序(insertion-sort):                                           是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入     算法稳定性:                  

    2024年02月09日
    浏览(56)
  • 八大排序算法之归并排序(递归实现+非递归实现)

    目录 一.归并排序的基本思想 归并排序算法思想(排升序为例) 二.两个有序子序列(同一个数组中)的归并(排升序) 两个有序序列归并操作代码: 三.归并排序的递归实现 递归归并排序的实现:(后序遍历递归) 递归函数抽象分析:  四.非递归归并排序的实现 1.非递归归并排序算法思想

    2024年02月03日
    浏览(42)
  • 线性链表 反转 -(递归与非递归算法)_20230420

    前言 线性链表反转是非常有趣的算法,它可以采用多种方式实现,比较简洁的方法是递归反转;传统的方式是利用迭代反转,设定三个变量,采用类似滚动数组的方式,实现线性表的反转;利用线性表头部插入方法也不失为一种直观有效的方式,这种情况下需要重新建立线性

    2023年04月24日
    浏览(39)
  • 排序算法进阶——归并排序【详细图解,递归和非递归】

    在了解归并排序之前让我们先了解一下归并这一算法吧! 归并算法一般应用于合并两个已经有序的序列,使合并后的序列也有序,是一个时间复杂度为O(N)的算法,不过一般要借助两个要排序的序列的元素个数个额外的空间。 一一一一一一一一一一一一一一一一一一一一一

    2024年01月24日
    浏览(46)
  • [C/C++]排序算法 快速排序 (递归与非递归)

    目录 🚩概念: 🚩实现: ⚡1.hoare ⚡2.挖坑法 ⚡3.双指针法 🚩快速排序递归实现 🚩快速排序非递归实现           通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据比另一部分的所有数据要小,再按这种方法对这两部分数据分别进行快速排序,整

    2024年02月03日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包