Algorithm 当数据项是传入的而不是已经存在时比较排序算法

Algorithm 当数据项是传入的而不是已经存在时比较排序算法,algorithm,sorting,complexity-theory,Algorithm,Sorting,Complexity Theory,我在算法方面处于中级水平。最近,当我比较不同的排序算法时,这件事一直困扰着我 当数据是传入的而不是已经存在时,如何比较不同的排序算法 我自己也比较了一些,但不太确定这是否是正确的方法 插入排序:顾名思义,它为O(n^2)复杂性问题提供了一个很好的解决方案 堆排序:技术是为推送的每个数据项构建堆。它对应于一个具有O(logn)复杂性的筛选操作,然后将第一个元素与最后一个元素交换,并使用Heapify恢复堆属性。Heapify又是O(logn),所以总体复杂度是O(nlogn logn)。但是如果我

我在算法方面处于中级水平。最近,当我比较不同的排序算法时,这件事一直困扰着我

当数据是传入的而不是已经存在时,如何比较不同的排序算法

我自己也比较了一些,但不太确定这是否是正确的方法

插入排序:顾名思义,它为O(n^2)复杂性问题提供了一个很好的解决方案

堆排序:技术是为推送的每个数据项构建堆。它对应于一个具有O(logn)复杂性的筛选操作,然后将第一个元素与最后一个元素交换,并使用Heapify恢复堆属性。Heapify又是O(logn),所以总体复杂度是O(nlogn logn)。但是如果我们已经有了所有的数据项,那么它只是O(nlogn),因为我们在构建堆之后只对数据项执行Heapify操作

选择排序:排序前需要所有数据项,因此我假设使用选择排序无法解决我们的问题

树排序:此技术的主要步骤是构建最坏情况时间复杂度为O(n^2)的树。然后按顺序遍历就可以了

我对其他算法不是很确定

我发布这个问题是因为我想完全掌握这些排序技术。
如果你发现我的问题或比较中有任何不一致之处,请原谅

插入排序:顾名思义,它为O(n^2)复杂度问题提供了一个很好的解决方案

我同意,不管是哪种情况,都不是那么好

堆排序:该技术是为推送的每个数据项构建堆。它对应于一个具有O(logn)复杂性的筛选操作,然后将第一个元素与最后一个元素交换,并使用Heapify恢复堆属性。Heapify又是O(logn),所以总体复杂度是O(nlogn logn)。但是如果我们已经有了所有的数据项,那么它只是O(nlogn),因为我们在构建堆之后只对数据项执行Heapify操作

您可以使用最小堆二叉树来实现这一点,但如果您使用的是数组,这可能会很困难

选择排序:排序之前需要所有数据项,因此我假设使用选择排序无法解决我们的问题

这两种情况都很糟糕

树排序:该技术的主要步骤是构建最坏情况时间复杂度为O(n^2)的树。然后按顺序遍历就可以了

O(nlogn)如果使用基数排序。请参阅关于数组的堆排序注释

其他类别:
计数排序:如果你事先不知道数据,那就太糟糕了。因为你真的不知道在手之前你需要多少空间

基数排序:仍然令人惊讶,将是两种情况下最好的排序算法。特别是当你用字节排序的时候。您所要做的就是在数据输入时输入柱状图,然后将其存储到临时链接列表中。然后再进行基数排序


Bucket排序:可以任意选择,比计数排序好得多,不如基数排序。

插入排序:顾名思义,它为O(n^2)复杂度问题提供了一个很好的解决方案

我同意,不管是哪种情况,都不是那么好

堆排序:该技术是为推送的每个数据项构建堆。它对应于一个具有O(logn)复杂性的筛选操作,然后将第一个元素与最后一个元素交换,并使用Heapify恢复堆属性。Heapify又是O(logn),所以总体复杂度是O(nlogn logn)。但是如果我们已经有了所有的数据项,那么它只是O(nlogn),因为我们在构建堆之后只对数据项执行Heapify操作

您可以使用最小堆二叉树来实现这一点,但如果您使用的是数组,这可能会很困难

选择排序:排序之前需要所有数据项,因此我假设使用选择排序无法解决我们的问题

这两种情况都很糟糕

树排序:该技术的主要步骤是构建最坏情况时间复杂度为O(n^2)的树。然后按顺序遍历就可以了

O(nlogn)如果使用基数排序。请参阅关于数组的堆排序注释

其他类别:
计数排序:如果你事先不知道数据,那就太糟糕了。因为你真的不知道在手之前你需要多少空间

基数排序:仍然令人惊讶,将是两种情况下最好的排序算法。特别是当你用字节排序的时候。您所要做的就是在数据输入时输入柱状图,然后将其存储到临时链接列表中。然后再进行基数排序


Bucket排序:可以任意选择,比计数排序好得多,不如基数排序好。

一次一个项目构建一个堆不会增加任何额外的复杂性(而且您的
O(n log n log n)
对我来说毫无意义)。事实上,构建堆的正常方法是每次向堆中添加一项。也就是说,即使您有所有项目可供开始,您也可以先构建前两个项目的堆,然后添加第三个、第四个项目,依此类推。如果您一次只接收一个项目,则根本不会导致任何额外工作。它以O(N logn)结束,就像往常一样

需要明确的是:将项目交换到第一个位置,然后筛选到树中不是为了添加项目,而是为了删除项目。也就是说:当您将所有项插入堆中后,您正在读取以生成排序输出。您可以通过将堆底部的项(即数组中的第一项)交换到数组的末尾,然后获取从堆底部开始的项