何时使用每种排序算法 |设置 2
排序是按特定顺序排列一组数据的过程,可以是数字(升序、降序)或字典(字母)顺序。
为什么需要排序?
当需要高度优化搜索算法时,排序是非常重要的。例如,让我们假设搜索某个元素的两种情况。
案例 1:从一组随机元素中搜索一个元素。 (未分类)
案例 2:从有序的元素集中搜索元素。 (已排序)
很明显,在情况 2 中搜索元素会更容易和更快,因为元素之前已排序,因此搜索将花费更少的时间。
何时使用每种排序算法?
对于数据排序,可以使用不同的算法对数据进行排序,但出现的主要问题是,如何选择合适的算法以实现最高效率?
在选择排序算法之前,有一些 需要考虑的因素:
- 数据大小:存在的元素或数据的总数可大可小。
- 数据状态:数据是完全随机的、部分排序的还是几乎排序的。
- 时间和空间复杂性:我们需要投资的时间和空间量。
让我们看一下各种排序算法:
堆排序:它从可用元素构建二进制堆数据结构,然后使用堆进行排序。它是一种基于比较的(就地)排序算法,没有二次最坏情况运行时间。堆排序可以根据以下约束使用:
- 这个算法最好的一点是它不需要任何额外的内存,所以如果需要一种不需要额外空间的算法,那么可以进行堆排序。
- 它表现出一致的性能。所以它在最好的、平均的和最坏的情况下都表现良好。由于其有保证的性能,它用于具有关键响应时间的系统。
- 堆运动特别适合对大量元素进行排序。
时间复杂度:
- 最佳情况: O(N*log N)
- 平均情况: O(N*log N)
- 最坏情况: O(N*log N)
空间复杂度: O(1)
Shell Sort :它是一种就地比较排序。该算法避免了大的移位,例如在插入排序的情况下,如果较小的值在最右边并且必须移动到最左边。与插入排序或冒泡排序相比,Shell 排序更有效,并且在以下情况下使用它:
- 较小的值元素位于数组/列表的末尾。
- 当有一个大的数组/列表并且靠近的元素相距很远时,通过这种算法我们可以减少这些元素之间的距离,因此在这种情况下需要更少的交换。
- 当递归超过限制时,可以使用此算法。
时间复杂度:
- 最佳情况: O(N*log N)
- 平均情况:取决于间隙序列
- 最坏情况: O(N*log 2 N)
空间复杂度: O(1)
基数排序:它是一种非比较排序算法。它通过根据基数创建元素并将其分配到存储桶中来避免比较。它具有线性时间复杂度,优于比较排序算法的 O(N*log N)。可以根据以下约束使用基数排序 -
- 当给定列表中元素的重复次数不多,但元素的长度在相同范围内时,使用基数排序是有益的。
- 基数排序广泛用于可以按字典顺序排序的数据。
- 它也适用于稳定地排序字符串。
时间复杂度:
- 最佳情况: O(N*K)
- 平均情况: O(N*K)
- 最坏情况: O(N*K)
空间复杂度: O(N + K)
桶排序:桶排序通过将数组的元素分配到多个桶中来工作。然后将每个桶单独排序并附加到一个数组中。这是一个相当稳定的算法,因为一旦元素被分配到桶中,每个桶都可以独立于其他桶进行处理。桶排序可以根据以下约束使用 -
- 它用于加快排序过程,因为将项目放入桶中然后以较小数量对它们进行排序的过程比任何其他线性排序算法(如冒泡排序)要快得多。
- 当输入均匀分布在一个范围内时,它非常有用。
- 桶排序的另一个优点是它可以用作外部排序算法。
时间复杂度:
最佳情况: O(N + K)
平均情况: O(N)
最坏情况: O(N 2 )
空间复杂度: O(N*K)
计数排序:该算法通过计算数组中每个唯一元素的出现次数来对数组元素进行排序。它通常用作另一种排序算法中的子程序,例如基数排序,可以更有效地处理更大的键。这不是比较排序。计数排序可根据以下约束使用:
- 当不同键(小数字)之间的差异不是很大时,它很有用。
- 当列表/数组包含有限范围的数字并且重复很多时,在这种情况下,计数排序将很有帮助。
- 是一种稳定的排序算法。
时间复杂度:
- 最佳情况: O(N + K)
- 平均情况: O(N + K)
- 最坏情况: O(N + K)
空间复杂度: O(N + K)