自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(19)
  • 收藏
  • 关注

原创 初级算法题(下)

这是由 LeetCode 官方推出的经典面试题目清单,我们将题目重新整理规划,从而为大家提供更好的练习体验和帮助大家找到理想的工作。这一系列 LeetBook 将帮助您掌握算法及数据结构,并提高您的编程能力。编程能力就像任何其他技能一样,也是一个可以通过刻意练习大大提高的。......

2022-07-31 19:20:28 323 2

原创 初级算法题(上)

这是由LeetCode官方推出的经典面试题目清单,我们将题目重新整理规划,从而为大家提供更好的练习体验和帮助大家找到理想的工作。这一系列LeetBook将帮助您掌握算法及数据结构,并提高您的编程能力。编程能力就像任何其他技能一样,也是一个可以通过刻意练习大大提高的。大多数经典面试题目都有多种解决方案。...

2022-07-31 19:14:39 312 1

原创 探究二级指针、二维数组

探究二级指针简单来说,二级指针存储一级指针的地址,指向一级指针。double a = 0, b = 0, c = 0, d = 0;double* p0 = &a;double* p1 = &b;double* p2 = &c;double* p3 = &d;double** s = &p0;如果a、b、c、d的地址是连续分配的,指针p0、p1、p2、p3的地址也是连续分配的,那么下面三种情况:s + 1; //&p1 移动4个字节 类型

2021-05-10 23:45:48 190

原创 二分查找

二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好;缺点是要求待查找表是有序表,而且插入删除困难。因此,二分查找适用于不经常变动的有序列表。首先,假设表中元素按升序排列,将表中间的元素与待查找元素进行比较,如果两者相等,则查找成功;否则利用中间位置元素将表分成前后两个子表,如果表中间元素大于待查找元素,则在前一个子表中查找,否则在后一个子表中查找。重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,这时查找失败。循环方法int findvalue(int* br, in

2021-05-08 10:22:51 191

原创 排序算法:快速排序

快速排序快速排序时目前广泛应用的一种排序算法。它的实现简单,适用于各种不同的输入数据且在一般应用中比其他排序算法都要快得多。基本算法快速排序是一种分治的排序算法。它将一个数组分成两个子数组,将两部分独立地排序。快速排序和递归排序是互补的:归并排序将两个数组分别排序,并将有序的子数组归并以将整个数组排序;而快速排序将数组排序的方式则是当两个子数组都有序时整个数组也就自然有序了。所以区别就是,在第一种情况中,递归调用发生在处理整个数组之前;在第二种情况中,递归调用发生在处理整个数组后。在归并排序中,一个数

2021-01-21 22:55:41 191

原创 排序算法:归并排序

归并排序现在所讨论的算法基于归并这个操作,即将两个有序的数组归并成一个更大的有序数组。人们根据这个操作发明处了一种递归排序算法:归并排序。要将一个数组排序,可以先(递归地)将它分成两半分别排序,然后将结果归并起来。原地归并的抽象方法要想实现归并,一种直截了当的方式是将两个不同的有序数组归并到第三个数组中,这种方法虽然简单,但是不适合处理大数组的排序。我们会进行多次的归并,而每次归并都会产生新的数组,这可能会产生一些问题。所以我们希望的是原地归并,就是可以使归并后仍然存回原数组中,节省空间。我们用方法m

2021-01-20 23:42:31 120

原创 初级排序算法:选择排序,插入排序与希尔排序

初级排序算法包含两种初级的排序算法和其中一种的一个变体,他们相对简单,通过学习这几种算法可以帮助我们熟悉一些技巧和术语,为探索那些更复杂但也更高效的排序算法打下基础。我们事先约定常用的辅助方法,这些方法将在算法中多次使用:less() 方法对元素进行比较。exchange() 方法将元素交换位置。代码如下所示:void exchange(int arr[],int a, int b) { int temp; temp = arr[a]; arr[a] = arr[b]; arr[b] =

2021-01-20 00:17:53 136

原创 排序算法:堆排序

优先队列许多程序都需要处理有序的元素。但不一定要求他们全部有序,或是不一定要一次就将它们排序。很多情况下我们会收集一些元素,处理当前键值最大的元素,然后再收集更多的元素,再处理当前最大的元素,如此这般。例如,现在绝大部分电脑或是手机等电子设备都可以同时运行多个应用程序。这是通过未每个应用程序的事件分配一个优先级,并总是处理下一个优先级最高的事件来实现的。例如,绝大部分手机分配给来电的优先级都会比游戏程序高。在这种情况下,一个合适的数据结构应该支持两种操作:删除最大元素和插入元素。这种数据类型叫做优先队列

2021-01-19 16:23:47 232

原创 二叉树的前序非递归遍历

二叉树的前序非递归遍历前面学习过二叉树的前序遍历,使用递归的方式。简单回顾一下:Status PerOrder(BiTree T) { //前序遍历二叉树 if (T != NULL) { Visit(T); PerOrder(T->lchild); PerOrder(T->rchild); } return OK;}接下来用非递归的方式实现二叉树的前序遍历。我们可以利用栈来辅助实现该功能。定义二叉树的结构体:typedef struct BiTree{//定义

2020-12-08 14:54:56 4937 2

原创 哈夫曼树和哈夫曼编码(附完整C语言代码)

概念哈夫曼树,也叫最优二叉树。在含有给定的n个带权叶子结点的二叉树中,WPL最小的树。其中,结点的权指的是某种特定含义的数值;带权路径长度值根到结点的路径长度乘以结点权值;树的带权路径长度(WPL)是指树中所有叶子结点的带权路径长度之和。构造根据哈夫曼算法,叙述如下:1.根据给定的n个权值{w1,w2,…,wn}构成的n棵二叉树集合F={T1,T2,…,Tn},其中每棵二叉树Ti中只有一个带权为wi的根结点,其左右子树均为空。2.在F中选取两棵根结点权值最小的树作为左右子树构造一棵新的二叉树,且置

2020-12-02 23:42:06 22633 14

原创 平衡二叉树(AVL)

平衡二叉树的定义平衡二叉树(Balance Binary Tree),简称平衡树(AVL树),树上任意结点的左子树和右子树的高度之差不超过1。平衡因子=左子树高-右子树高平衡二叉树结点的平衡因子的值只可能是1、-1、0。只要有任意结点的平衡因子不等于这三个值,那么二叉树不平衡。...

2020-11-30 12:19:40 2915 4

原创 二叉排序树(Binary Search Tree)

二叉排序树的定义二叉排序树,又称二叉查找树,我们这样定义:树非空,对于任意结点存在左子树或右子树,则左子树上所有结点的关键字均小于该结点的关键字,右子树上所有结点的关键字均大于该节点的关键字,这样的二叉树叫二叉排序树。即:左子树结点值<根结点值<右子树结点值还有一个默认规定,在二叉排序树中,不能有两个结点关键字相同。...

2020-11-29 23:55:02 437 1

原创 线索二叉树的线索化、及遍历

线索二叉树遍历二叉树是以一定规则将二叉树中结点排列成一个线性序列,得到二叉树中结点的先序序列或中序序列或后序序列。这实际上是对一个非线性序列结构进行线性化操作,使每个结点(除了第一和最后一个)在这些线性序列中有且仅有一个直接前驱和直接后继。现在的问题是,在常用的二叉链表作为存储结构时,我们只能找到结点左右孩子的信息,而不能直接找到结点在任意序列中前驱以及后继的信息,这些信息只能通过遍历的动态过程中得到。另一方面,在一个含有n个结点普通二叉树当中,有n-1个空链域,我们利用这些空链域来存储结点之间的前驱

2020-11-29 17:20:28 888 4

原创 二叉树的遍历

二叉树的遍历树形结构是一类重要的非线性数据结构,二叉树是树形结构中重要的一种,l了解二叉树,学会使用二叉树,便可以,可以触类旁通,对更多的类似二叉树的树形结构有进一步的认识和了解。要想遍历一个二叉树,首先要了解几种遍历的方式,在这之前,我们要说明,这里的遍历是指按某条路径访问路径上的每一个结点。这个访问的含义很广,可以打印该节点的数据域,或者其他各种处理等。由于二叉树属于树形结构,是非线性数据结构的一种,所以它的遍历需要有一种规律,将二叉树上所有结点排列在一个线性队列上,从而便与遍历。因而我们列出四种

2020-11-23 23:28:07 682 1

原创 KMP算法

C语言数据结构之KMP算法的应用通过学习串的朴素算法可以知道,要想实现匹配两个字符串,我们可以通过穷举的方法,及定义两个分别指向主串和模式串的“指针”,每次检索一个字符,若相同,则两个指针同时后移,检查下一个字符;若不相同,则让主串指针“回溯”的方式来比对下一个模式串长度的字符串是否和模式串匹配。这种方式虽然简单易懂,但是在很多情况下,将会重复做很多没有意义的匹配,时间开销较大。在这里,若主串的长度为m,模式串的长度为n,可以得出朴素算法的时间复杂度为O(mn)所以,为了减小时间开销,提高程序运行效

2020-11-21 17:39:11 797 1

原创 一元稀疏多项式相加

一元稀疏多项式相加实验原理通过链表存储多项式的系数和指数。对于指数并不是按照从低到高排列的多项式,通过冒泡排序的思想将指数从低到高排序,构成有序的多项式链表。在计算多项式加法的时候,通过定义一个新的链表用于存储相加之后的多项式,然后定义两个分别指向两个待加链表首元的指针,比较两个指针指向的指数域的大小关系,进行结点之间的交换、相加等链表操作,所有操作结束后,返回新的链表,及相加后的多项式,并用循环语句输出新链表各结点的系数域和指数域,程序结束。代码实现#include<stdio.h&

2020-11-20 00:36:10 1082 1

原创 数据结构括号匹配问题

数据结构括号匹配问题要求大、中、小括号两两匹配,基本思路可以通过栈来实现。这里我使用的是简单的静态顺序栈,大小固定,同时定义了栈顶指针top。程序包含了栈的几个最基本的操作,初始化、判空、压入、弹出,此外还有一个匹配函数,该函数接受一个数组和其长度做参数,判断是否括号匹配成功。然后是处理括号的问题,思路是扫描数组中的括号,遇到左括号就进行压栈操作,遇到右括号先判断栈中是否还有元素(即左括号),若没有则右括号“单身”,匹配失败,若栈中存在元素,就进行出栈操作,将栈顶的元素弹出与右括号进行配对,判断是否成功

2020-11-14 00:45:38 1804 2

原创 线性表的归并(分别用顺序存储和链式存储实现)

线性表的归并题目描述:已知顺序线性表La和Lb的元素按值非递减排列。归并La和Lb得到新的顺序线性表Lc,Lc的元素也按值非递减排列。顺序存储实现#include<stdio.h>#define LIST_INIT_SIZE 100 //线性表储存空间的初始分配量#define LISTINCREMENT 10 //线性表储存空间的分配增量#define TRUE 1#define FALSE 0#define OK 1#define ERROR 0#def

2020-11-08 15:12:56 1997 2

原创 基于栈的进制转换

#include<stdio.h>#include<stdlib.h>#define TRUE 1#define FALSE 0#define OK 1#define ERROR 0#define OVERFLOW -1int STACK_INIT_SIZE = 100;//存储空间初始分配量//int STACKINCREMENT = 10;//存储空间增量//定义一个栈typedef struct { int* base; int* top; int stacksize

2020-11-06 17:21:35 1509 2

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除