
数据结构
文章平均质量分 52
小象一只
刚开始学习图像处理知识
展开
-
欧几里得算法
欧几里得算法简介欧几里得算法证明欧几里得算法实现扩展欧几里得算法欧几里得算法简介欧几里得算法又称为辗转相除法,用于计算两个整数的最大公因子。基本算法:设,其中a,b,q,r都是整数,则,即欧几里得算法证明第一种方法证明a可以表示成,则假设d是a和b的一个公约数,则有和又因为,则有因此,d是a和b的一个公约数假设d是b和的公约数,则有原创 2015-05-02 20:47:19 · 446 阅读 · 0 评论 -
线性表学习归纳总结三:线性表链式存储 不带头结点
线性表的链式存储,需要考虑链表是否带有头指针,是不是循环链表,是不是双链表带有头结点的单链表循环链表双链表不带有头结点的单链表,头指针head直接指向第一个结点,带有头结点的单链表,head指向头结点,头结点的存储结构和后续结点一样,但只使用了头结点的next指针域。链表存储结构原创 2015-06-10 15:10:02 · 612 阅读 · 0 评论 -
线性表学习归纳总结五:不带头结点的循环链表
循环链表与单链表的区别在于,最后一个结点的指针域。不带头结点循环链表最后一个结点的指针域指向链表的第一个结点,带头结点的话,最后一个结点的指针域指向头结点。 而单链表中,最后一个结点的指针域为null。基本运算中的区别在于:链表扫描时候的终点条件;以及在插入和删除操作时候, 需要注意是否需要修改最后一个结点的指针域。获得循环链表的最后一个结点的存储地址n原创 2015-06-10 15:28:59 · 2227 阅读 · 0 评论 -
栈(二):顺序栈
顺序栈的存储结构原创 2015-05-29 22:53:29 · 411 阅读 · 0 评论 -
栈(三):链式栈
链式栈的存储结构typedef int datatype;typedef struct link_node{ datatype info; struct link_node *next; //指向下一个结点的link_node指针}node;基本运算实现node *init(); //建立一个空的链式栈int empty(node *top); //判断链式栈是否为空data原创 2015-06-10 15:45:33 · 532 阅读 · 0 评论 -
237、Delete Node in a Linked List [Leetcode]
题目 给定单链表的一个节点(不是最后一个节点),请删除它分析 没有表头,如何找到这个节点的前一个节点? 方法:采用“懒删除”,当前节点复制下一个节点的内容,然后删除下一个节点C代码/** * Definition for singly-linked list. * struct ListNode { * int val; * struct ListNode *n原创 2015-07-25 18:45:33 · 355 阅读 · 0 评论 -
92、Reverse Linked List II [Leetcode]
Reverse Linked List II 题目描述 在链表原位置上,翻转位置m到n上的结点,指遍历链表一次分析 如何找到第m个元素和第n个元素 如何处理前面和后面 1.保存前面部分最后一个元素 2. 保存后面部分第一个元素 3. 特殊情况都有哪些:是否需要修改头指针C代码/** * Definition for singly-linked list. *原创 2015-07-25 18:18:31 · 350 阅读 · 0 评论 -
查找单链表的中间节点
因为单链表只能向后查找的原因,查找单链表的中间节点,最一般的解法是,先遍历一次链表得到链表的长度,然后再遍历一半链表,得到链表中间元素。 还有一种比较机智的办法是,利用快慢指针,设两个指针,一个指针每次走一步,一个指针每次走两步,当每次走两步的指针到达链表尾部的时候,每次走一步的指针刚好到达链表中间。Node * findMiddleNodeOfLinedList(Node *head){原创 2015-07-26 17:18:15 · 491 阅读 · 0 评论 -
6. 重建二叉树
题目描述: 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并输出它的后序遍历序列。解析 根据先序遍历和中序遍历还原二叉树的主要思想: 1、先序遍历序列的第一个元素必定是根节点,可以由此获原创 2015-07-19 12:30:10 · 354 阅读 · 0 评论 -
24. 二叉搜索树的后序遍历序列
题目描述 输入一个整数数组,判断该整数数组是不是某二叉搜索树的后序遍历的结果,如果是则返回true,否则返回false。假设输入数组的任意两个数字都互不相同解析 在后序遍历得到的序列中,最后一个数字是树的根结点的值。数组中前面的数字可以分为两部分:第一部分是左子树结点的值,它们都比根结点的值小,第二部分是右子树结点的值,它们都比根结点的值大。主要代码实现bool V原创 2015-07-20 16:29:14 · 387 阅读 · 0 评论 -
8. 旋转数组的最小数字
题目描述 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 解析 1. 递增数组的旋转,例如,数组{1 2 3 4 5},经过旋转可以是{2 3 4 5 1},{3 4 5 1 2},{1 2 3 4 5},{原创 2015-07-19 15:07:41 · 328 阅读 · 0 评论 -
38. 数字在排序数组中出现的次数
题目描述 统计一个数字在排序数组中出现的次数。例如,输入排序数组{1,2,3,3,3,3,4,5}和数字3, 由于3在这个数组中出现了4次,因此输出4.解析 1. 解法一: 该解法是最直观的解法,可以先使用二分查找先找到这个元素,然后分别向左和向右遍历,把左右相同的元素的个数都计算出来。 该方法很直观,当算法的效率太低。 2.解法二: 可以将原创 2015-07-20 16:33:15 · 355 阅读 · 0 评论 -
线性表学习归纳总结二:线性表顺序存储实现
线性表顺序存储实现顺序表的存储结构顺序表的基本运算原创 2015-05-29 14:42:56 · 635 阅读 · 0 评论 -
快速排序的三路划分法
快速排序中带有大量重复关键字的时候,简单的由一个划分元素将元素分成两个子文件的算法效率低。很自然地想到了“荷兰国旗问题”,采用三路划分,将与划分元素相等的元素又区分出来,减少不必要的递归程序。在快速排序中,当两个运动的指针遇到与划分元素相等的元素时候,将该元素数组的两端:左指针遇到的交换到数组的左端,右指针遇到的交换到数组的右端。需要增加两个指针,指向数组左右端可以存储相等元素的位置。原创 2015-06-10 16:15:48 · 1329 阅读 · 0 评论 -
快速排序中小文件采用插入排序
减少小文件在递归调用中的进栈和出栈的时间可以提高快速排序的效率,非递归调用中同样存在小文件排序时候的进栈出栈操作。一种显然的的方法就是在递归调用之前,检测是否为小文件排序,如果是的话,才用插入排序方法进行小文件排序。void quicksort_smallFile(Item a[], int l, int r) //小文件排序采用插入排序方法{ int i; if(r-l <= M)原创 2015-06-10 16:14:41 · 460 阅读 · 0 评论 -
线性表学习归纳总结一
线性表学习资料:线性表学习掌握知识点:顺序存储链式存储循环链表双链表线性表学习总结文档下载地址:数据结构线性表学习笔记总结原创 2015-05-29 14:25:28 · 515 阅读 · 0 评论 -
线性表学习归纳总结六:不带头结点的双链表
双链表与单链表的区别:双链表有两个指针域,存储结构上需要耗费更多的空间。双链表的插入和删除操作需要修改的指针更多,但可以方便的得到结点的前驱结点。双链表的存储结构typedef int datatype;typedef struct dlink_node{ datatype info; struct dlink_node *llink, *rlink;}dnod原创 2015-06-10 15:33:39 · 657 阅读 · 0 评论 -
栈(一)
栈的知识点总结:栈有根据存储结构分为顺序栈和链栈顺序栈的存储结构链栈的存储结构原创 2015-06-10 15:36:13 · 384 阅读 · 0 评论 -
队列(二):顺序存储队列
顺序存储队列需要掌握操作:顺序存储队列存储结构#define MAXSIZE 5typedef int datatype;typedef struct{ datatype a[MAXSIZE]; int front; int rear;}sequence_queue;基本运算实现void init(sequence_queue *sq);原创 2015-05-30 20:20:11 · 477 阅读 · 0 评论 -
队列(三):链式存储队列
链式存储队列的存储结构typedef int datatype;typedef struct link_node{ datatype info; struct link_node *next;}node;typedef struct{ node *front, *rear;}queue;基本运算实现queue *init(); //建立一个空的链式队列int empty(q原创 2015-06-10 16:01:23 · 400 阅读 · 0 评论 -
直接插入排序
参考:直接插入排序插入排序总结排序算法中的直接插入排序。内容包括:插入排序介绍直接插入排序介绍直接插入排序图文说明直接插入排序的时间复杂度和稳定性分析直接插入排序的实现直接插入排序的分析与改进插入排序介绍插入排序(Insertion Sort)的基本思想是:每次将一个待排序的记录,按其关键字大小插入到前面已经排好序的子文件中的适当位置,直到全部记录插入完成为止。原创 2015-06-02 11:28:34 · 533 阅读 · 0 评论 -
选择排序
选择排序的介绍选择排序(Selection sort)是一种简单直观的排序算法。它的基本思想是:首先在未排序的数列中找到最小(or最大)元素,然后将其存放到数列的起始位置;接着,再从剩余未排序的元素中继续寻找最小(or最大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。选择排序的说明 n个记录的文件的直接选择排序可经过n-1趟直接选择排序得到有序结果:原创 2015-06-02 22:11:38 · 439 阅读 · 0 评论 -
快速排序的三者取中划分
使用一个尽可能在文件中间划分的元素。一种选择划分元素的方法是从文件中取出三个元素,使用三个元素的中间元素作为划分元素。取数组中的左边元素、中间元素和右边元素,对这三个元素排序。以中间值为划分元素!void quicksort_smallFile_median(Item a[], int l, int r) //小文件排序采用插入排序方法,三者取中{ int i; if(r-l <=原创 2015-06-10 16:15:18 · 3773 阅读 · 2 评论 -
线性表学习归纳总结四:线性表链式存储 带头结点
线性表的链式存储,带有头结点的链表可以减少对特殊情况的判断处理,不需要再对空表进行特殊处理。在一般单链表中,第一个结点有head指示,而在带有头结点的单链表中,head指示的是所谓的头结点,它不是数据结构中的实际结点,第一个实际结点是head->next指示的。链表的存储结构和一般单链表没有区别typedef int datatype;typedef struct原创 2015-06-10 15:13:36 · 655 阅读 · 0 评论 -
队列(一)
队列的定义和基本运算顺序队列循环队列链式队列原创 2015-06-10 15:51:52 · 414 阅读 · 0 评论 -
二叉树的实现
参考:二叉查找树(一)之 图文解析 和 C语言的实现目录二叉树的存储结构定义前序遍历二叉树中序遍历二叉树后序遍历二叉树二叉树的创建:利用前序遍历的方法查找二叉树中值为x的结点地址统计二叉树中结点的个数判断二叉树是否等价求二叉树的高度以上函数实现都是利用树的递归定义!二叉树的存储结构定义typedef int datatype;typedef str原创 2015-06-01 16:43:58 · 411 阅读 · 0 评论 -
希尔排序
参考:希尔排序、希尔排序学习希尔排序介绍希尔排序(Shell Sort)是插入排序的一种,它是针对直接插入排序算法的改进。该方法又称缩小增量排序,因DL.Shell于1959年提出而得名。希尔排序实质上是一种分组插入方法。它的基本思想是:对于n个待排序的数列,取一个小于n的整数gap(gap被称为步长)将待排序元素分成若干个组子序列,所有距离为gap的倍数的记录放在同一个组中;然后原创 2015-06-02 13:14:23 · 474 阅读 · 0 评论 -
冒泡排序
交换排序介绍交换排序的基本思想是:两两比较待排序记录的关键字,发现两个记录的次序相反时即进行交换,直到没有反序的记录为止。应用交换排序基本思想的主要排序方法有:冒泡排序和快速排序。冒泡排序介绍冒泡排序(Bubble Sort),又被称为气泡排序或泡沫排序。它是一种较简单的排序算法。它会遍历若干次要排序的数列,每次遍历时,它都会从前往后依次的比较相邻两个数的大小;如果前者原创 2015-06-02 21:25:26 · 521 阅读 · 0 评论 -
快速排序
分治法的基本思想分治法的基本思想是:将原问题分解为若干个规模更小但结构与原问题相似的子问题。递归地解这些子问题,然后将这些子问题的解组合为原问题的解。快速排序介绍快速排序是C.R.A.Hoare于1962年提出的一种划分交换排序。它采用了一种分治的策略,通常称其为分治法(Divide-and-ConquerMethod)。它的基本思想是:选择一个基准数,通过一趟排序将要原创 2015-06-02 21:41:57 · 529 阅读 · 0 评论 -
快速排序的非递归实现
快速排序的非递归实现使用了一个显示的下推栈使用向栈中压入参数和过程调用/退出不断地从栈中弹出参数来替代递归调用。把两个子文件的较大者压入栈中。快速排序的非递归实现#include #include #include "seqstack.h"typedef int Item;#define exch(A, B) {Item t = A; A = B; B = t;}原创 2015-06-10 16:14:18 · 440 阅读 · 0 评论 -
31. 连续子数组的最大和
题目描述 输入一个整型数组,数组里有正数也有负数。数组中一个或连续的多个整数组成一个子数组。求所有子数组的和的最大值。要求时间负责度为O(n)。解析 1. 解法一: 看到这个题目,我们首先想到的是求出这个整型数组所有连续子数组的和,长度为n的数组一共有 n(n+2)/2个子数组,因此要求出这些连续子数组的和最快也需要O(n^2)的时间复杂度。但是题目要求的O(n)的时间复杂度,因此上述思路不原创 2015-07-24 16:23:25 · 472 阅读 · 0 评论