无痕就地选择排序

Posted

技术标签:

【中文标题】无痕就地选择排序【英文标题】:Traceless in place selection sort 【发布时间】:2020-02-11 14:04:52 【问题描述】:

给定一个长度为 n 的数组 A[1..n],每个单元包含一个〈height,weight〉对。所有身高值都是不同的,所有体重值也是如此。该数组按高度值的升序排序。您的任务是设计一个递归分治算法,给定一个整数 k∈[1,n],找到具有第 k 个最小权重值的条目。在每个递归级别中,您只能使用 O(1) 额外空间。尽管您的算法可以在需要时重新排序 A 的条目,但它必须在终止之前恢复条目的原始顺序。您的算法必须在 Θ(n) 时间内运行。

我能想到的算法是选择排序,但在时间和空间复杂度方面我做不到。任何帮助或指导将不胜感激。

【问题讨论】:

【参考方案1】:

如果算法平均为 O(n),您可以使用快速排序。如果使用快速排序直到证明枢轴是第k个元素本身(最坏情况为O(n ^ 2),平均为O(n)),快速排序可以平均在O(n)中找到第k个元素。

现在棘手的部分是:您需要恢复原始数组。对排序数组的分区过程的第一次迭代很简单:只需以相反的方向运行该过程并重建初始数组。现在递归的想法出现了:如果枢轴恰好大于第k个元素,你仍然有左子数组排序:你可以重复这个过程,找到第k个并恢复数组。但是,如果您发现枢轴低于第 k 个元素......然后恢复数组并运行快速排序“反射”(您开始从右到左移动)。在这种情况下,来自枢轴的右子数组将被排序。递归地重复这个过程。

【讨论】:

以上是关于无痕就地选择排序的主要内容,如果未能解决你的问题,请参考以下文章

11.python排序算法之冒泡排序简单选择排序,二元选择排序直接插入排序

各种排序算法的时间复杂度

算法-详解堆排序算法

排序算法之快速排序Java实现

Quicksort与就地合并排序

归并排序-就地排序