![](https://img-blog.csdnimg.cn/20201014180756754.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构与算法
qgmobile_conghua
这个作者很懒,什么都没留下…
展开
-
树和二叉树
树代表一种非线性的数据结构,如果一组节点之间存在复杂的一对多关联时,程序就可以考虑使用树来保存这组数据。树的两种表示法: 父节点表示法:每个节点都记录它的父节点。 树中除了根节点之外的每个节点都有一个父节点,为了记录树中节点与节点之间的父子关系,可以为每个节点增加一个parent域,用以记录该节点的父节点。 特点:每个节点可以快速找到他的父原创 2012-07-14 02:38:10 · 588 阅读 · 0 评论 -
栈和队列
栈的实现有两种:顺序栈和链栈 由于栈不需要实现随机存取功能,只需要从栈顶插入、删除元素,因此顺序就够所提供的高效存取就没有太大的价值,即使采用链式结构的实现,程序同样可以高效的出入栈。 对于链栈而言,底层链式结构只需要保存几个节点,每个节点需要额外添加一个next引用,会引起部分空间浪费;但对于顺序栈来说,程序开始就需要在底层开辟一块连续的内存,这种空间浪费更多。从空间利用率的原创 2012-07-14 02:40:22 · 474 阅读 · 0 评论 -
线性表
线性表的两种具体实现:顺序实现和链式实现。 空间性能:顺序表的存储空间是静态分布的,需要一个长度固定的数组,因此总有部分数组元素被浪费;链表的存储空间是动态分布的,因此不会空间被浪费,但由于链表需要额外的空间来为每个节点保存指针,因此也需要浪费一些空间。 时间性能:顺序表中元素的逻辑顺序与物理存储顺序保持一致,而且支持随机存取,因此顺讯表在查找、读取时性能很好;链表采用链式结构保原创 2012-07-14 02:39:55 · 537 阅读 · 0 评论 -
二分查找
给定有序数组,从中查找指定的数据项。分析:输入数组有序,二分查找从数组中间而不是端点开始查找,记录low和high,如果被查找项存在,这两个值用来确定被查找数据项在数组的范围;初始范围是0到N-1,low=0,high=N-1;如果low大于high,则查找项不存在。算法[0(logN)]: public int binarySearch( int[] a , int原创 2012-08-10 14:16:13 · 461 阅读 · 0 评论 -
希尔排序
给定无序的数组,进行排序。分析:(1)希尔德思想是避免大量数据的移动,先比较相距较远的元素,再比较较近的元素。(2)希尔建议gap(间隔)从N/2开始,并一直减半,知道gap等于1。(3)在最坏情况下,希尔增量表现出了二次行为。(4)gap除以2.2在实践中表现出优秀的性能。算法[O(N的3/2次方)]: public void shellSort( in原创 2012-08-10 14:16:58 · 337 阅读 · 0 评论 -
快速排序
给定无序的数组,进行排序。分析:(1)快速排序是一种快速的分治算法,之所以快是因为非常紧凑而又高度优化的内部循环。(2)最佳情况运行时间O(NlogN),最坏情况运行时间O(N的平方),平均情况运行时间O(NlogN)。(3)通过选择任意元素,称为支点,分割成为两个互不相交的组,然后递归进行分割排序。(4)通常选择中间元素((low+high)/2)作为支点,也可以选择原创 2012-08-10 14:17:58 · 345 阅读 · 0 评论 -
最大连续子序列和的问题
给定整数A1、A2、A3....(整数可能为负),求连续整数∑A的最大值。分析:(1)最大连续子序列不可能是负值;(2)所有与最大连续子序列的和一定为负(或0),否则最大连续子序列将包括这类子序列(3)对于任意Ai...Aj有S算法[O(N)]: public int maxmumSubsequenceSum( int[] a ) { int原创 2012-08-10 14:14:57 · 996 阅读 · 0 评论 -
归并排序
给定无序的数组,进行排序。分析:(1)如果排序项为0或者1,则返回。(2)分别递归的对前半部分和后半部分排序。(3)将两个有序部分归并成一个有序组。算法[时间复杂度O(NlogN)、空间复杂度(N)]: public void mergeSort( int[] a ) { int[] tmp = new int[a.length] ;原创 2012-08-10 14:17:22 · 282 阅读 · 0 评论