如何从快速排序和插入排序创建混合函数?

how to create an hybrid function from quicksort and insertion sort?

提问人:bib 提问时间:11/17/2023 最后编辑:bib 更新时间:11/18/2023 访问量:18

问:

我想设计一种新的排序算法,它结合了快速排序和插入排序的优点。一开始我不知道我的数组是否被排序。因此,我需要在快速排序和插入之间选择一个有效的方法才能开始。我会选择快速排序。在执行过程中,我如何决定是否从快速排序切换到插入排序? 因此,我认为我需要在快速排序的新排序算法中添加几乎相同的代码,并且需要添加一个新的基本情况。我认为这种关系应该反映输入数组的长度和递归深度之间的关系,这种关系对于行为良好的快速排序是有效的。

因此,由于快速排序中的最大树深度(递归)是 n,min 是 logn,我的想法是否正确,将新的基本情况添加为:

if len(less_than_pivot) == (n-1) :
  return insertion_sort(less_than_pivot)
elif len(greater_than_pivot)== n-1:
  return insertion_sort(greater_than_pivot)

less_than_pivot表示数组包含所有小于枢轴的元素(greater_than_pivot相同)。

因此,原则上,我需要混合排序算法,考虑快速排序性能可能下降的点(例如,几乎排序的数组),并相应地切换到插入排序。

快速 插入-排序

评论

1赞 k314159 11/17/2023
许多现有的排序方法(例如 Java 的 Arrays.sort)都使用 Quicksort 和 Insertion Sort 的组合,因此请查看现有的实现以获取想法。如果元素数较小(例如,少于 20 个),请使用插入排序。否则,请仔细选择枢轴。例如,取 3 个随机元素,取中间值作为枢轴。此外,定期查看元素并确定数组是否大部分已经排序,在这种情况下,请使用插入排序。

答: 暂无答案