【问题标题】:Modified Binary Search Tree for Sorting?修改后的二叉搜索树进行排序?
【发布时间】:2012-07-13 12:51:23
【问题描述】:

我必须对数组进行排序。除了已经存在的排序类型之外,我想知道这样的算法是否可行,以及它的复杂性可能是什么。

我有一个要排序的数组。我创建了一个二叉搜索树。

所以如果我将数组的所有元素都插入到BST中,然后在进行树的中序遍历时将它们一一分配回数组,我将得到排序的结果。 (虽然由于树节点而消耗更多的空间复杂度。不是就地排序。)

int i=0;

void sort_by_inorder(node *n)
{
    if(n==NULL)
    {
        return;
    }
    sort_by_inorder(n->leftchild);
    array[i++]=n->data;
    sort_by_inorder(n->rightchild);
}

我知道 BST 不允许重复插入,所以也许我们可以考虑将 BST 插入算法修改为 = 用于右子树。

这是一个很好的实现(可行)吗?复杂度是多少?

平均遍历复杂度为O(n)。插入只是O(log n)。所以在我看来,这应该是一种有效的算法。

谢谢。

【问题讨论】:

  • 每次插入都是 O(log n),所以你实际上以 O(n*log n) 结束
  • 您应该进行有序遍历,而不是预先遍历。
  • @DylanM。是的。对不起。我的代码是中序遍历,但名称是前序遍历。已编辑。

标签: tree complexity-theory sorting binary-search-tree


【解决方案1】:

在一般的二叉搜索树中,最坏情况下插入时间实际上是O(n)。您需要一个平衡树才能使操作为 O(log(n))。

所以在一般的 BST 中,您的方法允许您以 O(n^2) 进行排序。

【讨论】:

  • 谢谢。是的,我理解最坏的情况。想知道为什么在任何地方都没有提到这种排序!我以为我发现了一些全新的东西。 :D
  • 我们在我的数据结构课上讨论过这个,但我可以想象如果人们不谈论它,那是因为它与其他 O(nlogn) 排序算法相比是不必要的复杂,而且它是在实践中可能会慢一些。话虽如此,如果您使用 AVL 树或其他保证 O(logn) 插入的树,那么这在理论上与合并排序(在时间和空间复杂度上)相当。您可能会感兴趣的类似的东西是 Heapsort。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-08
相关资源
最近更新 更多