
数据结构(C)
红桃Ace
这个作者很懒,什么都没留下…
展开
-
链表c语言实现
表是一种常用的数据结构,可以采用数组实现和链表实现。若采用数组实现,需要对表的大小进行事先估计,通常需要估计的大一些,从而会浪费一些空间,这是严重的局限,特别是在存在许多未知大小的表的情况下。数组实现使得PrintList和FInd操作以线性时间执行,而FindKth(查找第K个元素)则花费常数时间。然而,插入和删除的花费则是昂贵的。例如,在位置0插入元素,首先需要将整个数组后移一个位置一空出原创 2013-04-27 21:50:46 · 1443 阅读 · 0 评论 -
优先队列之二叉堆与d-堆
简介平时所说的堆,若没加任何修饰,一般就是指二叉堆。同二叉树一样,堆也有两个性质,即结构性和堆序性。正如AVL树一样,对堆的以此操作可能破坏者两个性质中的一个,因此,堆的操作必须要到堆的所有性质都被满足时才能终止。结构性质堆是一棵完全填满的二叉树,因为完全二叉树很有规律,所以它可以用一个数组表示而不需要指针。如下图所示,图2中的数组对应图1中的堆。原创 2013-06-18 20:11:42 · 1598 阅读 · 0 评论 -
左式堆
简介设计一种堆结构像二叉堆那样高效的支持合并操作而且只使用一个数组似乎很困难。原因在于,合并似乎需要把一个数组拷贝到另一个数组中去,对于相同大小的堆,这将花费O(N)。正因为如此,所有支持高效合并的高级数据结构都需要使用指针。像二叉堆那样,左式堆也有结构性和堆序性。不仅如此,左式堆也是二叉树,它和二叉堆之间的唯一区别在于:左式堆不是理想平衡的,而实际上是趋向于非常不平衡。左式堆性质原创 2013-06-19 14:02:28 · 4076 阅读 · 4 评论 -
二叉查找树c语言实现
二叉查找树描述二叉查找树的性质:对于树中的每个结点X,它的左子树中所有关键字值小于X的关键值,而它的右子树中所有关键字大于X的关键值。由于树的递归定义,通常是递归的编写查找树的常用操作例程。对这些常用例程中,主要需要考虑的是插入和删除节点。下面将简要说明。(二叉查找树的平均深度是O(logN),所以一般不需要担心栈空间用尽。)Insert:为了将X插入到树T中,可以像用Find那样沿着树查原创 2013-04-30 15:20:37 · 1538 阅读 · 1 评论 -
各种排序之插入、希尔、堆排序
算法插入排序是最简单的排序算法。插入排序有N-1趟排序组成。对于P=1趟到P=N-1趟,插入排序保证从位置0到位置P上的元素已为排序状态。插入排序利用了这样的事实:位置0到位置P-1上的元素师拍过序的。图1显示一个简单的数组在每一趟排序后的情况。图1:每趟后的插入排序如下代码实现了上述想法:void InsertionSort(ElementType A[], int N)原创 2013-07-29 20:02:29 · 1043 阅读 · 0 评论 -
排序之归并、快速排序
归并排序归并排序以O(NlogN)最坏运行时间运行,而所使用的比较次数几乎是最优的,它是递归算法一个很好的实例。这个算法中基本的操作是合并两个已排序的表。因为这两个表示已排序的,所以若将输出放到第三个表中时则该算法可以通过对输入数据一趟排序来完成。基本的合并算法是取两个输入数组A和B,一个输出数组C,以及三个计数器Aptr,Bptr,Cptr,它们初始置于对应数组的开始端。A[Aptr原创 2013-08-12 19:34:21 · 901 阅读 · 0 评论 -
B-树
M阶B-树:一棵M阶B-树或者是一棵空树,或者是满足下列特性的M叉树: (1)树的根或者是一片树叶,或者其儿子数在2和M之间; (2)除根之外的所有非终端结点的儿子数在éM/2ù和M之间;(3)所有的树叶都在相同的深度上所有的数据都存储在树叶上。在每一个内部节点上皆含有指向该节点各儿子的指针P1,P1,…Pm和分别代表在子树P2,P3,…Pm中发现的最小关键字的值K1,K2,…原创 2013-08-19 15:48:22 · 1113 阅读 · 0 评论 -
二项队列
虽然左式堆每次操作花费O(logN),这有效的支持了合并,插入和DeleteMin,但还是有改进的余地,因为我们知道,二叉堆以每次操作花费常数平均时间支持插入。二项队列支持所有这种操作,每次操作的最坏情形运行时间为O(logN),而插入操作平均花费常数时间。二项队列结构二项队列不同于左式堆和二叉堆等优先队列的实现之处在于,一个二项队列不是一棵堆序的树,而是堆序树的集合,即森林。堆序树中的每原创 2013-06-26 20:18:04 · 2491 阅读 · 1 评论 -
散列表
简介散列表(Hash Table)的实现常常叫做散列(Hash)。散列是一种用于常数时间进行插入、删除和查找的技术。但是,那些需要元素箭任何排序信息的操作将不会得到有效的支持。因此,FindMin、FindMax以及以线性时间按排序将整个表进行打印的操作是散列表不支持的。理想的散列表数据结构只不过是一个包含有关键字的具有固定大小的数组。典型情况下,一个关键字就是带有相关值的字符串。把表的大原创 2013-06-03 20:47:17 · 1113 阅读 · 0 评论 -
队列——链表与数组实现(数据结构与算法分析C语言版)
链队列:一个链队列显然需要两个分别指向队头和队尾的指针(即头指针和尾指针)才能唯一确定。一般,为了操作方便,可以给链队列添加一个头结点,并令头指针指向头结点。由此,空的链队列的判决条件为:头指针和尾指针均指向头结点,如下图所示:头文件:queue.htypedef int ElementType;#ifndef _QUEUE_LIST_#define _QUEUE_LIS原创 2013-04-28 10:46:21 · 2797 阅读 · 1 评论 -
AVL树C语言实现
AVL树介绍AVL树是带有平衡条件的二叉查找树。这个平衡条件必须容易保持,而且它必须保证树的高度是O(logN)。AVL树其每个节点的左子树和右子树高度最多差1(空树的高度为-1),每个节点保留其高度信息。下图中,左边的图是AVL树,而右边的不是。节点插入当对一个AVL树插入节点后,只有那些从插入节点到根节点的路径上的节点的平衡可能被改变,因为这些节点的子树可能发生变化。当我们原创 2013-05-02 11:22:02 · 1954 阅读 · 0 评论