algorithm - 混合快速/合并排序在随机数据上的性能
问题描述
一个测试要求我实现一个排序算法,该算法对一个数组进行排序,当大小为 N > 1000 时,通过合并排序,否则通过带有枢轴的快速排序随机选择。然后假设要比较的键由 [1, M] 上的随机分布的整数组成。M 应该如何才能使上述算法运行得最好?
如果大小<=1000,我让快速排序处理合并排序的递归调用。在我看来,由于随机键、随机枢轴和 Hoare 的分区方案不会因重复元素而减慢,如果 M 远小于 N,快速排序将运行在最佳状态,合并排序对于特定数组大小运行相同不管密钥分配如何,这里的 M 是做什么用的?
解决方案
必须小心实施快速排序以避免病态情况。随机选择枢轴是避免排序数组的二次时间复杂度的好方法,但对于具有许多重复元素的数组来说,这还不够。
如果M
远小于N
,您将有很多重复项。原始算法不能有效地处理重复,这将导致快速排序性能显着下降,因为 Hoare 的原始算法仅在具有所有相同元素的数组上的每个递归级别删除一个元素。
有关实际实现的研究,请参阅此问题,它在具有小范围内随机分布数据的数组上的行为以及如何修复快速排序实现以避免性能下降:基准测试快速排序和合并排序产生合并排序更快
推荐阅读
- python - 如何使用“group_by”查询塑造响应
- sql - 如何获取以映射表中的键命名的列的表
- jquery - th:field 使用 ajax 重新加载片段后生成错误的名称属性值
- lua - Lua Pattern,组合句柄的问题
- php - Zend 框架:使用自己的视图模板返回 410(已消失)
- python - 初学者输入验证问题
- c# - UWP ListView 内容边距
- python - 使用 pysftp 从 SFTP 服务器将文件下载到本地计算机时出现 PermissionError
- java - ORA-00979 不是按表达式分组
- csv - Kibana 使用 CSV 文件进行搜索