为了避免omega(nlogn)所有基于比较的排序的下界,我们在课堂上学习了一堆新的非比较排序。但对我来说有点不清楚的是什么时候使用哪种排序算法系列的优点和缺点。
不能调整任何数据集以便可以使用非比较排序算法(基数、桶、键索引)吗?如果是这样,那么即使存在比较排序又有什么意义呢?
很抱歉这是一个如此基本的问题,但我真的在网上找不到任何东西。
并非每组项目都可以调整为以有效的方式用于非比较排序。例如,对任意精度数字进行排序需要多次运行桶排序内的循环,从而降低性能。
基数排序的问题在于,它们必须检查正在排序的每个项目的每个元素。另一方面,基于比较的排序可以跳过相当数量的子元素(数字、字符等)。例如,当比较函数检查两个字符串时,它会在第一个差异处停止,跳过两个字符串的尾部字符串。另一方面,桶排序必须检查每个字符串*中的所有字符。
一般来说,追求最佳渐近复杂度并不总是一个好的策略:使用更复杂的算法获得回报的 N 值通常太高,无法使更复杂的算法变得实用。例如,快速排序的时间复杂度非常差,但平均而言,由于其开销非常低,它轻而易举地击败了大多数其他算法,这使其成为大多数实际情况下的不错选择。