
数据结构和算法
文章平均质量分 80
czq_lh
愿你看尽世间繁华,归来任是少年。
展开
-
数据结构与算法学习笔记——查找算法
1 顺序(线性)查找1.1 介绍为简单的一种,既从头到尾遍历,直到直到要查询的为止。1.2 代码实现package com.czq.algorithm.search;/** * 顺序(线性)查找 * 适合于存储结构为顺序存储或链接存储的线性表 * * @author czq * @date 2020/07/22 */public class OrderSearch { public static void main(String[] args) {原创 2022-04-14 11:55:28 · 952 阅读 · 0 评论 -
数据结构与算法学习笔记——排序算法(八):堆排序
1、介绍堆排序是利用堆这种数据结构而设计的一种排序算法,堆排序是一种选择排序,它的最坏,最好,平均时间复杂度均为 O(nlogn),它也是不稳定排序。堆是具有以下性质的完全二叉树:每个结点的值都大于或等于其左右孩子结点的值,称为大顶堆(注意 : 没有要求结点的左孩子的值和右孩子的值的大小关系)。 每个结点的值都小于或等于其左右孩子结点的值,称为小顶堆。一般升序采用大顶堆,降序采用小顶堆。2、算法分析(1)将待排序序列构造成一个大顶堆,整个序列的最大值就是堆顶的根节点。(2)再原创 2020-07-31 17:52:07 · 239 阅读 · 0 评论 -
数据结构与算法学习笔记——排序算法(七):基数排序
1、介绍(1)基数排序(radix sort)属于“分配式排序”(distribution sort),又称“桶子法”(bucket sort)或 bin sort,顾名思义,它是通过键值的各个位的值,将要排序的元素分配至某些“桶”中,达到排序的作用(2)基数排序法是属于稳定性的排序,基数排序法的是效率高的稳定性排序法(3)基数排序(Radix Sort)是桶排序的扩展(4)基数排序是 1887 年赫尔曼·何乐礼发明的。它是这样实现的:将整数按位数切割成不同的数字,然后按每个位数分别比较。原创 2020-07-21 11:54:09 · 228 阅读 · 0 评论 -
数据结构与算法学习笔记——排序算法(六):归并排序
1、介绍归并排序(MERGE-SORT)是利用归并的思想实现的排序方法,该算法采用经典的分治(divide-and-conquer)策略(分治法将问题分(divide)成一些小的问题然后递归求解,而治(conquer)的阶段则将分的阶段得到的各答案"修补"在一起,即分而治之)。2、算法分析(1)分解:每次把数组分均分为两份,利用递归的方法分解数组,直至每个小数组为1个大小。(2)合并相邻有序子序列:再来看看治阶段,将两个已经有序的子序列合并成一个有序序列,比如上图中的最后一次合并原创 2020-07-21 11:46:35 · 299 阅读 · 0 评论 -
数据结构与算法学习笔记——排序算法(五):快速排序
1、介绍快速排序(Quicksort)是对冒泡排序的一种改进。基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列2、算法分析3、代码实现...原创 2020-07-21 11:44:29 · 169 阅读 · 0 评论 -
数据结构与算法学习笔记——排序算法(四):希尔排序
1、介绍希尔排序是希尔(Donald Shell)于 1959 年提出的一种排序算法。希尔排序也是一种插入排序,它是简单插入排序经过改进之后的一个更高效的版本,也称为缩小增量排序。原创 2020-07-20 16:04:06 · 237 阅读 · 0 评论 -
数据结构与算法学习笔记——排序算法(三):插入排序
1、介绍插入排序(Insertion Sorting)属于内部排序法,是对于欲排序的元素以插入的方式找寻该元素的适当位置,以达到排序的目的。2、算法分析把 n 个待排序的元素看成为一个有序表和一个无序表,开始时有序表中只包含一个元素,无序表中包含有 n-1 个元素,排序过程中每次从无序表中取出第一个元素,把它的排序码依次与有序表元素的排序码进行比较,将它插入到有序表中的适当位置,使之成为新的有序表,直到无序表中的元素都插入到有序表中。3、代码实现package com.czq.al原创 2020-07-17 11:02:27 · 238 阅读 · 0 评论 -
数据结构与算法学习笔记——排序算法(二):选择排序
1、介绍选择排序(select sorting)属于内部排序法,是从欲排序的数据中,按指定的规则选出某一元素,再依规定交换位置后达到排序的目的。2、算法分析第一次从 arr[0]~arr[n-1]中选取最小值, arr[0]交换;第二次从 arr[1]~arr[n-1]中选取最小值,与 arr[1]交换;第三次从 arr[2]~arr[n-1]中选取最小值,与 arr[2] 交换;第 i 次从 arr[i-1]~arr[n-1]中选取最小值,与 arr[i-1]交换;第 n-1原创 2020-07-16 17:34:08 · 246 阅读 · 0 评论 -
数据结构与算法学习笔记——排序算法(一):冒泡排序
一、冒泡排序1、介绍通过对待排序序列从前向后(从下标较小的元素开始),依次比较相邻元素的值,若发现逆序则交换,使值较大的元素逐渐从前移向后部,就象水底下的气泡一样逐渐向上冒。优化: 因为排序的过程中,各元素不断接近自己的位置,如果一趟比较下来没有进行过交换,就说明序列有序,因此要在 排序过程中设置一个标志 flag 判断元素是否进行过交换。从而减少不必要的比较。(这里说的优化,可以在冒泡排 序写好后,在进行)2、算法分析(1)比较相邻的元素。如果第一个比第二个大,就交换它们两个;原创 2020-07-16 15:59:07 · 349 阅读 · 0 评论 -
数据结构与算法学习笔记——排序算法:简介
1、排序算法的介绍(1)介绍排序也称排序算法(Sort Algorithm),排序是将一组数据,依指定的顺序进行排列的过程。(2)相关概念稳定:如果a原本在b前面,而a=b,排序之后a仍然在b的前面;不稳定:如果a原本在b的前面,而a=b,排序之后a可能会出现在b的后面;内排序:所有排序操作都在内存中完成;外排序:由于数据太大,因此把数据放在磁盘中,而排序通过磁盘和内存的数据传输才能进行;时间复杂度: 一个算法执行所耗费的时间;空间复杂度:运行完一个程序所需内...原创 2020-07-16 10:08:03 · 235 阅读 · 0 评论 -
数据结构与算法学习笔记——数据结构(七):哈希表
1 介绍散列表(Hash table,也叫哈希表),根据关键码值(Key value)而直接进行访问的数据结构。 它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。 这个映射函数叫做散列函数,存放记录的数组叫做散列表。2 分析哈希冲突:哈希表关键码值key是通过哈希函数计算得到一个值,这个key反映的是在数组上的位置,当key值相同的时候就是哈希冲突。处理哈希冲突的方式:开放寻址法:如果位置被占了,那就另外再找个位置。最基本的方法就是查看该位置的后一个位置是否可用,如果没有原创 2022-04-18 10:35:54 · 249 阅读 · 0 评论 -
数据结构与算法学习笔记——数据结构(六):栈
1、介绍栈(stack)是一个先入后出(FILO-First In Last Out)的有序列表。栈是限制线性表中元素的插入和删除只能在同一端进行的一种特殊线性表。允许插入和删除的一端,为变化的一端,称为栈顶(Top),另一端为固定的一端,称为栈底(Bottom)。最先放入栈中元素在栈底,最后放入的元素在栈顶,而插入和删除元素顺序刚好相反,最后放入的元素最先删除,最先放入的元素最后删除2、思路分析3、代码实现package com.czq.datastructure;imp原创 2020-08-18 17:43:14 · 331 阅读 · 0 评论 -
数据结构与算法学习笔记——数据结构(五):队列
1、介绍队列是一个有序列表,可以用数组或是链表来实现。遵循先入先出的原则。2、思路分析队列本身是有序列表,若使用数组的结构来存储队列的数据,则队列数组的声明如下图,其中 maxSize 是该队列的最大容量。因为队列的输出、输入是分别从前后端来处理,因此需要两个变量 front 及 rear 分别记录队列前后端的下标, front 会随着数据输出而改变,而 rear 则是随着数据输入而改变,如图所示:当我们将数据存入队列时称为”addQueue”,addQueue 的处理需要有两个步骤原创 2020-08-10 14:52:26 · 300 阅读 · 0 评论 -
数据结构与算法学习笔记——数据结构(四):单向环形链表(约瑟夫问题)
1、约瑟夫问题约瑟夫问题其实也是一个游戏(丢手绢),也称为约瑟夫环。规则很简单:就是有一群小鬼围起来(例5个)成一个圈,先从第一个报数 n,以第一个小鬼开始报数,后面报到第n个小鬼,既出列,出列的第 n 个小鬼的后面一个继续报数n,依次类推直到所有小鬼都离开这个圈。解决方案:可以使用单向环形链表2、思路分析2.1、单向环形链表的构建和遍历分析(1)构建一个单向的环形链表思路先创建第一个节点, 让 first 指向该节点,并形成环形后面当我们每创建一个新的节点,就.原创 2022-04-12 11:01:49 · 2996 阅读 · 0 评论 -
数据结构与算法学习笔记——数据结构(三):双向链表
1、介绍在单链表中,有一个数据域,还有一个指针域,数据域用来存储相关数据,而指针域则负责链表之间的“联系”。 而在双向链表中,我们需要有两个指针域,一个负责向后连接,一个负责向前连接。单向链表的缺点分析: 单向链表,查找的方向只能是一个方向,而双向链表可以向前或者向后查找。 单向链表不能自我删除,需要靠辅助节点 ,而双向链表,则可以自我删除,所以前面我们单链表删除时节点,总是找到 temp,temp 是待删除节点的前一个节点2、思路分析双向链表的遍历,添加,修改,删除的操作思路:1)原创 2020-08-17 14:07:27 · 254 阅读 · 0 评论 -
数据结构与算法学习笔记——数据结构(二):单链表
1、介绍链表是有序的列表,但是它在内存中是存储如下链表是以节点的方式来存储,是链式存储每个节点包含 data 域, next 域:指向下一个节点.如图:发现链表的各个节点不一定是连续存储.链表分带头节点的链表和没有头节点的链表,根据实际的需求来确定单链表(带头结点) 逻辑结构示意图如下2、思路分析1) 第一种方法在添加节点时,直接添加到链表的尾部2) 第二种方式在添加节点时,根据编号将节点插入到指定位置(如果有这个排名,则添加失败,并给出提示)...原创 2020-08-12 16:30:11 · 363 阅读 · 0 评论 -
数据结构与算法学习笔记——数据结构(一):稀疏数组
问题:编写的五子棋程序中,有存盘退出和续上盘的功能分析问题:因为该二维数组的很多值是默认值 0,因此记录了很多没有意义的数据-->稀疏数组1、介绍当一个数组中大部分元素为0,或者为同一个值的数组时,可以使用稀疏数组来保存该数组。稀疏数组的处理方法是:记录数组一共有几行几列,有多少个不同的值;把具有不同值的元素的行列及值记录在一个小规模的数组中,从而缩小程序的规模。2、思路分析使用稀疏数组,来保留类似前面的二维数组(棋盘、地图等等)把稀疏数组存盘,并且可以从新恢.原创 2020-08-20 17:09:25 · 281 阅读 · 0 评论 -
数据结构与算法学习笔记——概述
1、介绍数据结构与算法的重要性算法是程序的灵魂,优秀的程序可以在海量数据计算的时候,依然保持高速计算。一般来讲,程序使用了内存计算框架(比如Spark)和缓存技术(比如Redis)来优化程序,再深入思考一下,这些计算框架和缓存技术,它的核心功能就是数据结构与算法。 拿实际工作经历说,在Unix下开发服务器程序,功能是要支持上千万人同时在线,在上线前,进行测试都OK,可是上线后,服务器就撑不住了,公司的CTO对代码进行优化,再次上线,就坚如磐石。这是程序的灵魂——算法。数据结构和算法的关系原创 2022-04-08 09:48:16 · 205 阅读 · 0 评论