数据结构和算法
靠近星星的太阳
一专多能、刻意练习、终身成长。
展开
-
数据结构与算法(十四)平衡二叉树(AVL树)
二叉排序树在使用时可能会出现极端的左或右斜树的现象,导致算法效率大大降低,这称为二叉排序树的不平衡。而我们在使用的时候,总是希望二叉排序树是平衡的,使算法的效率最大化,所以就有了平衡二叉树(AVL树)。1、平衡二叉树(AVL树)从平衡二叉树的英文名字,你也可以体会到,它是一种高度平衡的二叉排序树,那什么叫做高度平衡呢?意思是说,要么它是一棵空树,要么它的左子树和右子树都是平衡二叉树...原创 2019-05-12 18:12:40 · 312 阅读 · 0 评论 -
使用位运算优化乘、除以及模运算
总所周知,位运算在运算中是最快的,计算同样乘、除结果,效率却是乘、除的三倍,也就是耗时是乘除的三分之一。因此,可以使用位运算来代替部分算术运算,以此提高性能。其中最典型的就是对于整数的乘、除以及模运算的优化。&:二进制的与运算符。|:二进制的或运算符。^:二进制的异或运算符。~:二进制的取反运算符,所有位都取反。<<:二进制的按位左移运算符,有符号数左移...原创 2019-05-14 03:06:33 · 1346 阅读 · 0 评论 -
数据结构与算法(十九)希尔排序
希尔排序(ShellSort)是插入排序方式的一种,又称“缩小增量排序”,是直接插入排序算法的一种更高效的改进版本。直接插入排序,它的效率在某些时候是很高的,比如,数据集本身就是基本有序的,只需要少量的插入操作,就可以完成整个数据集的排序工作,此时直接插入很高效;还有就是数据量比较少时,直接插入的优势也比较明显。可问题在于,这两个条件本身就过于苛刻,现实中数据量少或者基本有序都属于特殊情况。...原创 2019-05-19 03:15:34 · 968 阅读 · 0 评论 -
数据结构与算法(十一)顺序查找和斐波那契查找
1、顺序查找顺序查找(Sequential Search)又叫线性查找,是最基本的查找技术,它的查找过程是:从表中第一个(或最后一个)数据开始,逐个进行数据的关键字和查找值比较,若某个记录的关键字和查找值相等,则查找成功;如果直到最后一个(或第 )记录,其关键字和查找值比较都不等时,则表中没有所查的记录,查找失败。1.1、顺序查找顺序查找使用for循环,肯定是我们最方便最常用的方法。...原创 2019-05-07 01:12:35 · 298 阅读 · 0 评论 -
数据结构与算法(二十)堆排序
堆排序(Heap Sort)就是对简单选择排序进行的一种改进,这种改进的效果是非常明显的。1、堆我们首先要知道什么是堆?堆是具有下列性质的完全二叉树:每个结点的值都大于或等于其左右孩子结点的值,称为大顶堆,或者每个结点的值都小于或等于其左右孩子结点的值,称为小顶堆。这里需要注意从堆的定义可知,根结点一定是堆中所有结点的最大(小)者。二叉树拥有这样一个性质 :如果对一棵有n个...原创 2019-05-20 01:10:50 · 349 阅读 · 1 评论 -
数据结构与算法(二十一)快速排序
1、快速排序算法快速排序(Quick Sort)的基本思想是:通过一趟排序将待排记录分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序的目的。基本实现思路:快速排序算法每一趟排序都需要一个基准数,一般以待排序的序列最左边的第一个数值为基准数,然后设置两个哨兵在待排序的序列的两端,左哨兵往右寻找比基准数大的数值,右哨兵...原创 2019-05-22 16:09:05 · 258 阅读 · 0 评论 -
数据结构与算法(十五)排序算法
排序算法是最基本的算法之一,也是平时最常见、最常用的算法。1、排序的稳定性对于一个未排序的序列, 其中a[2]和a[5]的关键字值相等,经过排序后,若原a[2]的位置仍在原a[5]之前,那么称该排序方法是稳定的;若原a[5]的位置反在原a[2]的前面,那么称该排序方法是不稳定的。只要有一组关键字发生类似的情况,便认为此排序方法不稳定。排序算法是否稳定,需要通过仔细分析才能得出。举个...原创 2019-05-14 23:29:31 · 168 阅读 · 0 评论 -
数据结构与算法(十六)冒泡排序和鸡尾酒排序
冒泡排序(Bubble Sort)是一种交换排序,它的基本思想是:两两比较相邻记录的关键字,如果反序则交换,以将当前序列的最小值交换到当前序列最前端为一轮结束,需要(length-1)轮,感觉数据是一个一个往上冒出来,这个现象类似“冒泡泡”,所以称为冒泡排序。1、顺序存储结构实现冒泡排序首先我们需要一个待排序的数组arr[10] = {0, 9, 1, 5, 8, 3, 7, 4, 6,...原创 2019-05-15 16:37:02 · 319 阅读 · 0 评论 -
数据结构与算法(十三)二叉查找树
之前提到的斐波那契查找、二分查找和插值查找都是基于有序的线性表存储结构,称为静态查找表,它们在查找表需要频繁插入和删除的操作的情况下不适用,那有没有即可以使得插入和删除效率不错,又可以比较高效率地实现查找的算法呢?这种需要在查找时插入或删除的查找表称为动态查找表。1、二叉查找树二分查找的过程既然能用二叉树进行表示,说明该逻辑可以使用二叉树进行实现,使用二分查找思想实现的二叉树就称为二叉查...原创 2019-05-08 16:55:58 · 180 阅读 · 0 评论 -
数据结构与算法(十七)选择排序
选择排序(Selection Sort)就是遍历n-1次数组,每次从待排序的数据中找出一个最小值或最大值,与第i位置上的数据进行交换。首先我们需要一个待排序的数组arr[10] = {0, 9, 1, 5, 8, 3, 7, 4, 6, 2},其中arr[0]=0用做哨兵或临时变量所以不参与排序,所以数组下标从1开始,有效长度len=9,实际长度为10。然后我们还需要交换数据的操作:...原创 2019-05-16 03:18:19 · 174 阅读 · 0 评论 -
数据结构与算法(八)二叉树的存储结构和遍历方法
1、二叉树的存储结构1.1、二叉树的顺序存储结构顺序存储结构也就是数组,对树这种一对多的逻辑关系结构实现起来是比较困难的,但是二叉树是一种特殊的树,由于它的特殊性,使得用顺序存储结构也可以实现。将二叉树按层序编号来对应数组的下标,并根据二叉树的性质来确定双亲结点和孩子结点在数组中的位置。先来看完全二叉树的顺序存储结构。由此体现出完全二叉树的优越性,由于它定义的严格, 所...原创 2019-05-01 02:58:56 · 348 阅读 · 0 评论 -
数据结构与算法(十二)二分查找和插值查找
1、二分查找有一个游戏最能体现二分查找的思路:我在纸上已经写好了100以内的正整数数字,然后请你猜,问最多几次可以猜出来?这个游戏的解法就是每次猜数后折取一半,我们把这种每次取中间记录查找的方法叫做折半查找,或二分查找。二分查找(Binary earch),也称为折半查找。它的前提是线性表中的记录必须是关键码有序(通常从小到大有序) ,线性表必须采用顺序存储。二分查找的基本思想...原创 2019-05-07 21:12:37 · 2393 阅读 · 0 评论 -
数据结构与算法(一)数组、链表
数组和链表是最重要的、最基本的数据结构,它们是其它所有数据结构的基础,它们无处不在。我们通常将数组和链表当作线性表使用,以下介绍数组和链表默认当作线性表。1、数组数组是应用最广泛的一种数据结构,几乎所有高级编程语言都会将数组作为基本数据类型使用,因此,数组通常不会被当做一种数据结构单独拿出来讲解。数组是最简单的数据结构,当做学习数据结构的敲门砖,以此为基础,了解数据结构的基本概念以...原创 2019-04-14 20:07:53 · 313 阅读 · 0 评论 -
数据结构与算法(零)初识
1、基本概念我们需要先了解清楚的数据的概念,才能学习数据结构。1.1、数据数据就是一个描述客观世界的符号。例如,整型、浮点型的数字、字符以及声音、图像、视频等。1.2、数据元素数据元素是组成有一定意义的基本单位。例如,在人类中,人就是数据元素;鱼类中,鲫鱼、鲤鱼、草鱼等都是鱼类的数据元素。1.3、数据项数据项是指一个数据元素可以由若干个数据项组成。比如,数据元素是...原创 2019-04-14 15:30:58 · 269 阅读 · 0 评论 -
数据结构与算法(四)队列
1、队列1.1、什么是队列操作系统在执行任务时,任务都是一个一个被执行,并且时先来的任务先执行。电脑偶尔会出现卡住的现象,鼠标点什么都没反应,但等待一会,又会把你之前卡住时鼠标点击的所有操作都按顺序执行一遍。这是因为电脑操作系统在执行一个耗时任务导致电脑卡住,而这期间鼠标点击的的操作也会加到任务队列中,但还未被执行所以没有反应,只有等耗时任务结束才会都被执行。队列是只允许一端进行插入操...原创 2019-04-21 15:09:15 · 215 阅读 · 0 评论 -
数据结构与算法(二)栈
1、栈1.1、什么是栈栈的结构类似于枪的弹夹,第一颗放入弹夹的子弹却是最后一颗被打出来,最后一颗放入弹夹的子弹却是第一颗被打出来,称为先进后出的数据结构。现实中,栈的应用非常广泛和普遍,例如,使用浏览器上网时,不管什么浏览器都会有 个"后退"键,点击后可以按访问顺序的逆序,加载浏览过的网页;如office、photoshop等文档或图像的编辑软件中,都有撤销(undo)的操作,也是使用...原创 2019-04-14 20:08:33 · 119 阅读 · 0 评论 -
数据结构与算法(九)二叉树的基本功能实现
1、二叉树的创建首先创建一颗二叉树需要输入结点,但是如果我们输入结点的前序遍历序列为:ABDC,我们如何确定哪个是左孩子?哪个是右孩子?因此为了能让每个结点确认是否有左、右孩子,我们需要对原二叉树进行扩展。也就是将二叉树中每个结点的空指针引出一个虚结点,其值为一个特定值,比如“#”。我们称这种处理后的二叉树为原二叉树的扩展二叉树。扩展二叉树就可以做到一个遍历序列确定一颗二叉树了。之前的...原创 2019-05-02 01:11:30 · 341 阅读 · 0 评论 -
数据结构与算法(十)哈夫曼树
什么叫做哈夫曼树呢?通过一个栗子来看。我们通常需要按照考试成绩的百分制转换为一个五级分制的成绩,于是得到下面的代码。if (score < 60) achievement = "不及格";else if (score < 70) achievement = "及格";else if (score < 80) achievement = "中等...原创 2019-05-04 03:50:21 · 918 阅读 · 0 评论 -
数据结构与算法(三)栈的简单应用
栈的应用十分广泛,例如之前提到的浏览器、图像或文本编辑器等等的回退操作,操作系统使用栈进行内存管理,栈还有一个很重要的应用就是在程序设计语言中实现了递归。1、进栈转换十进制与其他进制之间的转换,通常采用除基取余法,余数需要逆序取。栈是一种后进先出的数据结构,当需要逆序操作时,我们就可以使用栈实现十进制与其他进制之间的转换,因为无法限制十进制数的大小,所以这里使用链栈。这里只是实现了十进...原创 2019-04-21 01:00:49 · 346 阅读 · 0 评论 -
数据结构与算法(五)树形结构
1.1、树的定义之前提到的数组、单链表、栈、队列这些都是一对一的线性结构,可现实中却有很多一对多的情况需要处理,所以我们需要研究这种一对多的树形结构。树形结构可是比线性结构要复杂、繁琐得多,并且树形结构有非常多的子类结构:二叉树、堆、红黑树、B树、B+树等等。每个子类树在查找、排序、编码压缩、文件管理等等各个方面都展现了优秀的性能优势,这也是为什么要学习树形结构的重要原因。树( Tree'...原创 2019-04-24 14:31:13 · 2570 阅读 · 0 评论 -
数据结构与算法(七)二叉树的特点和性质
二叉树,顾名思义就是每个结点有两个分支(分叉、子树),所以叫二叉树。二叉树是树形结构里面最重要的一种结构,平衡查找树、红黑树、哈夫曼树等都是二叉树的子类结构。1、二叉树的特点二叉树的每个结点最多有两个分支、有两棵子树,没有子树或有一个子树也是可以的,所以二叉树中不存在度大于2的结点。 二叉树是有序树,左子树和右子树是有顺序的,次序不能任意颠倒。就像人是双手、双脚,但显然左手、左脚和右...原创 2019-05-01 02:58:47 · 3181 阅读 · 0 评论 -
数据结构与算法(六)树的构造
先来看看顺序存储结构,使用数组来实现这对于线性表来说是很自然的,但对于树这样一多对的结构呢?树中某个结点的孩子结点可以有多个,这就意味着,无论按何种顺序将树中所有结点存储到数组中,结点的存储位置都无法直接反映逻辑关系。你想想看,数据元素紧挨着的存储,如何判断谁是谁的双亲,谁是谁的孩子呢?简单的顺序存储结构——数组显然是是不能满足树的实现的要求的。我们可以利用结构体和数组的特点,通过对结...原创 2019-05-01 02:58:52 · 688 阅读 · 0 评论 -
数据结构与算法(十八)插入排序
插入排序(Insertion Sort)的基本思想是将后一个记录插入到前面已经排好序的有序序列中,从而得到一个新的、记录数增1的有序序列。最直观的栗子就是我们平时打斗地主,每次每人自己手动启一张牌,然后根据牌的大小,将刚启的牌插到手中的牌中。1、直接插入排序/*插入排序算法*/void Insertion_Sort(int *arr, int len) { for (in...原创 2019-05-18 15:55:34 · 129 阅读 · 0 评论