排序算法实现-二叉树排序(Java版本)
相关章节
二叉查找树(Binary Search Tree),也称二叉搜索树、有序二叉树,是指一棵空树或者具有下列性质的二叉树:
若任意节点的左子树不空,则左子树上所有结点的值均小于它的根结点的值;
若任意节点的右子树不空,则右子树上所有结点的值均大于它的根结点的值;
任意节点的左、右子树也分别为二叉查找树;
没有键值相等的节点。
二叉查找树相比于其他数据结构的优势在于查找、插入的时间复杂度较低。为O(log n)。
如果我们能够将一个数列构造成一个二叉树,那么按一定顺序获取到的新数列就是排序好的数列,二叉树排序算法就是依照这个实现的。那么二叉树怎么构建和查找呢?
二叉树的插入
向一个二叉搜索树b中插入一个节点s的算法,过程为:
若b是空树,则将s所指结点作为根节点插入,否则:
若s->data等于b的根节点的数据域之值,则返回,否则:
若s->data小于b的根节点的数据域之值,则把s所指节点插入到左子树中,否则:
把s所指节点插入到右子树中。(新插入节点总是叶子节点)
二叉树的查找
在二叉搜索树b中查找x的过程为:
若b是空树,则搜索失败,否则:
若x等于b的根节点的数据域之值,则查找成功;否则:
若x小于b的根节点的数据域之值,则搜索左子树;否则:
查找右子树。
Java实现以及解析
首先,我们需要创建一个类用于表示二叉树节点,它有左右两个子节点,当左右z节点都为空时候,则表示为叶子节点
我们再创建排序方法,操作步骤如下:
首先,构造二叉树,并将待排序数组一个个添加到二叉树中
然后从二叉树中读取到排序好的数列的原始index列表
根据排序好的数列index列表获取到排序好的数列
在执行流程中,最重要的就是插入数据到二叉树中的过程,因为在插入过程中会做排序
需要注意的是,在插入过程,待插入的数据一定会最终成为叶子节点,所以最终一旦发现找到的节点不为空的时候,一定要迭代子节点
获取排序好的序列过程,我们采用的是左序搜索算法
再排序过程其实没有必要了,有冗余,其实从上步中就可以得到排序好的数列,代码还是贴出
性能分析
每个结点的C(i)为该结点的层次数。
最坏情况下,当先后插入的关键字有序时,构成的二叉查找树蜕变为单支树,树的深度为n. 其平均查找长度为(n+1)/2,和顺序查找相同
最好的情况是二叉查找树的形态和折半查找的判定树相同,其平均查找长度和log2(n)
完整代码可参考: https://zhuanlan.zhihu.com/p/25623301
如果这对你有用,可以吧文章推荐给别人哦,粉我吧,每天都有干货哦
请先 后发表评论~