我很想知道如何根据输入选择排序算法,以便获得最佳效率。
应该是输入的大小还是输入的排列方式(Asc / Desc)或使用的数据结构等......?
一般来说,算法的重要性,以及在排序算法中的重要性如下:
(*)正确性——这是最重要的。如果您的算法超级快速且高效,但它是错误的,那么它一文不值。在排序中,即使您有 2 个正确排序的候选者,但您需要一个稳定的排序- 即使它效率较低,您也会选择稳定的排序算法 - 因为它对您的目的是正确的,而另一个则不是。
接下来基本上是在运行时间、所需空间和实现时间之间进行权衡(如果您需要从头开始实现某些东西而不是使用库,以实现较小的性能增强 - 这可能不值得)
在考虑上述权衡时需要考虑的一些事项:
O(n^2)
)。O(nlogn)
最坏情况。它应该基于所有这些。
您需要考虑数据的大小,因为对于小型数据集等,插入排序可能比快速排序更快
由于每种算法的最坏/平均/最佳情况渐近运行时间不同,您需要知道数据的排列(其中一些最坏/平均情况相同,而另一种可能具有明显更差的最坏情况与平均)
而且您显然需要知道使用的数据结构,因为如果您的数据已经采用特殊格式,或者即使您可以有效地将其放入一个新的数据结构中,它会自动为您进行排序(a la BST 或堆)
决定您选择排序算法的两个主要因素是时间复杂度和空间复杂度。根据您的方案和可用的资源(时间和内存),您可能需要根据每种排序算法必须提供的内容在排序算法之间进行选择。
排序算法的实际性能也取决于输入数据,如果我们事先知道输入数据的某些特征,例如输入的大小、数组已经排序的程度,将会有所帮助。
例如,如果您事先知道输入数据只有 1000 个非负整数,则可以很好地使用counting sort
线性时间对这样的数组进行排序。
排序算法的选择取决于空间和时间的限制,以及输入数据的大小/特征。
在非常高的水平上,您需要考虑插入与每种算法比较的比率。
对于文件中的整数,这不会有很大的相关性,但如果说您正在根据内容对文件进行排序,您自然会希望尽可能少地进行比较。