Skip to content

dayu521/datastructures

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

44 Commits
 
 
 
 
 
 
 
 

Repository files navigation

代码依据数据结构与算法分析c++描述写的,使用java,如有错误,希望大家不吝指正

基本采用递归。递归方式很巧秒
插入,删除,中序遍历,查找,最小值,后继操作。
平衡树:任意节点左右子树高度相差不超过1。
小坑较多,在二叉查找树的基础上进行平衡高度,定义null树高度为-1
仅有插入与删除操作和一些测试操作.单旋转与双旋转,四种情况两两对应,双旋转由两个单旋转组成。

拿插入来说递归思路,仅仅针对对此处递归不太清楚的初学者:
这件事的目标是【插入数据到一棵avl树,并返回插入后的新avl树】。
基准情况是插入一棵空的avl树,由于空树是avl树,所以不用调整,直接返回新的树,也就是新节点;
如果插入数据大于当前树根结点值,则调用递归插入右子avl树,并设置当前树节点的右节点为返回的avl树;
否则,同样插入左子avl树;
无论哪种情况。当前这棵树可能破坏了avl树平衡,所以要进行balance,然后把平衡后的树返回完成插入。

  • 这里我会重新用java实现一遍,之前图示的链接就舍弃掉了,因为目前看来它反而增加了理解难度

没什么好说的,建最大堆。采用下滤。
需要注意的是,是从0开始下标,并且最大堆的建立是从倒数第二层,从右向左,循环再从第三层一直到第一层(根节点)
正确性是因为假设倒数第二层开始后会有n个堆,则每一次遍历就会缩减到n/2(向上取整)个堆,最终就变成一个最大堆,
建堆的代价为O(2n).
O(n2)算法中比较有特点的一种:对数据有序识别很好。
  插入排序的改进,插入排序的特点是如果数据基本有序,其运行时间更快。希尔排序采用一个增量序列h1=1,h2,h3...hk。
  依次进行hk,h(k-1),h(k-2),..h1排序,共计k趟排序,每次排序数据更倾向于有序,因此最后一趟插入排序运行时间很短。
  具体每一趟排序过程是:对于hk,hk-1,hk-2...N-1(默认下标为0到N-1)中每一个值i,放到i-hk,i-2hk,i-3hk,...中正确
  的位置上。其编码很简单,理解稍微复杂点,不过分析倒是很难。对于数据量稍微大点,性能与复杂度很适合。
 
   堆排序与希尔排序对于循环的编写很有代表性,循环的编写应该把每次迭代的不变量放到循环体中,都要以这个基准来写条件测试表达式
关于能够使得分割的两个数组更加平衡的元素的选取,有两点需要注意:
1.枢纽元素的选取要想使分成的两部分更加均衡,毫无疑问,不能假定第一个元素或最后一个,甚至任意一个。
随机选取是没有办法实现(不值得花费实现代价)。通常情况下三中值,五中值选取。
2.对于和枢纽元素相同值的位置i,i是否停下来和j交换。对于相同值需要停下来交换才可能让i j的交叉点接近平衡。
否则对于特定输入,会分割成最坏条件,O(n2)。
实现细节上
采用三数取中值来获取随机的值的过程,不仅减少了最坏情况发生频率,实际更隐含了对边界的检查。
(由于只考虑执行效果,之前疏忽选取第一个元素作为枢纽,却忘记检查边界,导致产生越界错误。)
 分治。通常假设有两个排序好的部分,合并到一起,就排好了。对这两个部分分别继续用同样的方式排序。
 如果对数据的范围作假设,比方说对于0<n<N的整数,并且内存不那么稀有的情况下。计数排序也不是原址排序,以O(n)时间复杂度排序。
    用二进制表示数据,然后对每一位进行排序。从小位到大的位,并且利用 计数排序 的稳定性和O(n)时间复杂度进行每一位的排序
    最终也是一个O(mn)时间复杂度的算法.

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages