排序算法实现-二叉树排序(Java版本)

相关章节

二叉查找树(Binary Search Tree),也称二叉搜索树、有序二叉树,是指一棵空树或者具有下列性质的二叉树:

  1. 若任意节点的左子树不空,则左子树上所有结点的值均小于它的根结点的值;

  2. 若任意节点的右子树不空,则右子树上所有结点的值均大于它的根结点的值;

  3. 任意节点的左、右子树也分别为二叉查找树;

  4. 没有键值相等的节点。

二叉查找树相比于其他数据结构的优势在于查找、插入的时间复杂度较低。为O(log n)。

如果我们能够将一个数列构造成一个二叉树,那么按一定顺序获取到的新数列就是排序好的数列,二叉树排序算法就是依照这个实现的。那么二叉树怎么构建和查找呢?

  • 二叉树的插入

向一个二叉搜索树b中插入一个节点s的算法,过程为:

  1. 若b是空树,则将s所指结点作为根节点插入,否则:

  2. 若s->data等于b的根节点的数据域之值,则返回,否则:

  3. 若s->data小于b的根节点的数据域之值,则把s所指节点插入到左子树中,否则:

  4. 把s所指节点插入到右子树中。(新插入节点总是叶子节点)

  • 二叉树的查找

在二叉搜索树b中查找x的过程为:

  1. 若b是空树,则搜索失败,否则:

  2. 若x等于b的根节点的数据域之值,则查找成功;否则:

  3. 若x小于b的根节点的数据域之值,则搜索左子树;否则:

  4. 查找右子树。

  • Java实现以及解析

首先,我们需要创建一个类用于表示二叉树节点,它有左右两个子节点,当左右z节点都为空时候,则表示为叶子节点

我们再创建排序方法,操作步骤如下:

  1. 首先,构造二叉树,并将待排序数组一个个添加到二叉树中

  2. 然后从二叉树中读取到排序好的数列的原始index列表

  3. 根据排序好的数列index列表获取到排序好的数列

在执行流程中,最重要的就是插入数据到二叉树中的过程,因为在插入过程中会做排序

需要注意的是,在插入过程,待插入的数据一定会最终成为叶子节点,所以最终一旦发现找到的节点不为空的时候,一定要迭代子节点

获取排序好的序列过程,我们采用的是左序搜索算法

再排序过程其实没有必要了,有冗余,其实从上步中就可以得到排序好的数列,代码还是贴出

  • 性能分析

每个结点的C(i)为该结点的层次数。

  1. 最坏情况下,当先后插入的关键字有序时,构成的二叉查找树蜕变为单支树,树的深度为n. 其平均查找长度为(n+1)/2,和顺序查找相同

  2. 最好的情况是二叉查找树的形态和折半查找的判定树相同,其平均查找长度和log2(n)

完整代码可参考: https://zhuanlan.zhihu.com/p/25623301

如果这对你有用,可以吧文章推荐给别人哦,粉我吧,每天都有干货哦

举报
评论 0