二叉树和快速排序?

时间:2013-08-21 09:31:07

标签: c binary-search-tree quicksort

我的作业分配如下(不要火焰/担心,我要求你做我的作业):

  

编写一个程序,使用二进制搜索使用快速排序方法对一组数字进行排序   树。建议的实现是使用递归算法。

这是什么意思?以下是我的解释,正如我在下面解释的那样,我认为两者都有缺陷:

  

一个。从用户获取一组数字(整数或其他)。使用数组上的常规快速排序算法对它们进行快速排序。然后将内容放入二叉搜索树中,使数组的中间元素成为根,等等,完成。

     

B中。从用户获取数字,使用二进制搜索树的标准属性将它们一个一个地直接放入树中。树被“排序”,一切都做得很好。

这就是为什么我很困惑。选项'A'执行赋值所要求的所有内容,除非它实际上并没有真正使用二叉树,因为它最后会在最后一分钟抛出它,因为它是二叉树上的作业。这让我觉得预期的练习不可能是'A',因为主题不是快速排序,而是二叉树。

但选项'B'并没有好多少 - 它根本不使用quicksort!所以,我很困惑。

以下是我的问题:

  1. 如果解释是选项'A',就这么说,我没有问题,谢谢你的时间,再见。

  2. 如果解释是选项'B',为什么用于在二叉树中插入值的排序方法与quicksort相同?除了它们(我目前学到的形式)使用递归分治策略并将其输入分成两部分之外,它们似乎似乎本质上相似。

  3. 如果解释是别的......我该怎么办?

1 个答案:

答案 0 :(得分:4)

这是一个非常酷的观察。假设您按照您选择的顺序将一系列值插入二叉搜索树。某些值最终会出现在左子树中,而某些值将以右子树结束。具体来说,左子树中的值小于根,右子树的值大于根。

现在,假设你快速分配相同的元素,除了你使用BST根目录中的值作为支点。然后你将一堆元素放入左边的子阵列 - 小于枢轴的元素 - 和一些元素到右边的子阵列 - 大于枢轴的元素。请注意,左子树中的元素和BST的右子树将完美对应左子阵列中的元素和第一个快速排序步骤的右子阵列!

当您将内容放入BST时,在您将元素与根进行比较后,您将进入左侧或右侧子树并与之进行比较。在快速排序中,在您将阵列分区为左右子阵列后,您将为左侧选择一个轴并对其进行分区,然后选择右侧的轴并对其进行分区。同样,这里有一个美丽的对应关系 - 整个BST中的每个子树对应于使用子树的根在快速排序中执行一个枢轴步骤,然后在左右子树中递归地执行相同操作。

更进一步,我们得到以下声明:

  

每次runsort运行都对应一个BST,其中root是初始数据透视图,每个左右子树对应于相应子数组中的quicksort递归调用。

此连接非常强大:在将该元素插入BST时,将在该快速排序运行中进行每次比较,反之亦然。比较不是按照相同的顺序进行的,但它们仍然可以制作。

所以我怀疑你的导师要求你做的是以不同的方式实现快速排序:而不是对阵列和枢轴进行操作,而只是按照你喜欢的顺序将所有东西都扔进BST,然后使用inorder遍历遍历树以按排序顺序返回元素。

这样做的一个非常酷的结果是,您可以将quicksort视为二进制树排序的空间优化实现。分区和旋转步骤对应于构建左右子树,不需要显式指针。