您如何在中间位置实现枢轴快速排序,这种变化称为啥? [关闭]
Posted
技术标签:
【中文标题】您如何在中间位置实现枢轴快速排序,这种变化称为啥? [关闭]【英文标题】:How do you implement quicksort with the pivot in the middle position and what is this variation called? [closed]您如何在中间位置实现枢轴快速排序,这种变化称为什么? [关闭] 【发布时间】:2014-12-03 12:11:28 【问题描述】:如何在中间位置而不是最后一个/第一个位置的枢轴上实现快速排序?
【问题讨论】:
正如 Codor 所建议的,这被称为 Broken Quicksort :) 具体来说,它会对输入数组进行一次分区 - 它通常不会对其进行排序。 "我开发了快速排序的迭代版本吗?" - 不,递归快速排序依赖于调用堆栈来跟踪序列的哪些部分已经排序。您需要自己的类似堆栈的结构来在迭代版本中跟踪它。这只是常规快速排序的“分区”阶段,缺少对分区进行排序的递归调用。 顺便说一句,不需要写 swapItems,有一个(模板)std::swap 对所有类型都做同样的事情。 感谢 Mike 的堆栈建议,我会试试的 如果你谷歌迭代快速排序,你会看到它已经存在。 【参考方案1】:它似乎是Quicksort,正如函数名所暗示的那样;但是显然没有递归调用在旋转后对零件进行排序。我建议将输出移出函数quickSort
,并在旋转和重新排列之后添加对数组部分的递归调用。
【讨论】:
感谢大家的反馈。如果我在 if 块内移动左右索引增量会发生什么?然后它会正确地对数组进行分区吗? 顺便说一句,这不是家庭作业,哈哈,我只是喜欢算法......我的目标是用中间的枢轴对数组进行分区,而不是使用第一个/最后一个元素。通过这种方式,最坏情况下的运行时间得到改善。请问有什么建议吗? @GeneralDynamix,此答案中链接的有关快速排序的***文章解决了这个问题。 @Don Reba 给小费【参考方案2】:答案就在这篇文章中链接的***文章中。
【讨论】:
为什么不使用std::partition
? coliru.stacked-crooked.com/a/045c59d7f0113db3
明确允许回答您自己的问题并接受该答案;甚至还有一个徽章。 (我尽量坦白,如果我/看起来很讽刺,对不起。)
您的回答被否决了,因为您的回答没有用,也没有提供信息。这意味着这是一个糟糕的答案。没有必要张贴它。如果您发布了“这是快速排序的不完整实现”,那么您的答案将是正确的,如果您这样做有点机智或迷人,甚至可能赢得赞誉。
好的,我下次会小心点。感谢大家的建议和反馈。以上是关于您如何在中间位置实现枢轴快速排序,这种变化称为啥? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章