【发布时间】:2015-05-01 02:40:12
【问题描述】:
当然,每次递归都会增加 2*O(n),因为要找到最小值和最大值,而不是随机生成器的常数 O(1)。将其实现为枢轴时,您会得到在递归树的叶子上排序的列表,而不是在标准算法中,元素从根到叶子进行排序。
当实现而不是将枢轴作为列表中的一个值时,它只是一个与之相比的数字,因此这不是标准的快速排序,但我的问题仍然适用。
下面是我写得不好的伪代码:
func sort(List n):
if n.length < 2
return n;
min = n.minValue
max = n.maxValue
avg = (min+max) /2
List left = list of elements in n less than avg
List right = list of elements in n greater than avg
sort(left)
sort(right)
【问题讨论】:
-
对英语不好的朋友感到抱歉
-
恐怕您需要重新表述问题的主体。第一段描述了随机和真实中值快速排序的工作原理。第二段似乎包含你的实际问题,但它是不可理解的。您能否尝试澄清您在第二段中的要求?
-
您的问题是什么?你的问题是我们为什么不使用像你的伪代码这样的东西而不是随机快速排序?
-
从您的措辞方式来看,听起来您是在说随机枢轴查看列表中的所有值,并从中选择一个随机值。但是枢轴只是列表中的一个随机位置,不需要 O(n^2) 来计算。
-
您的问题是基于错误的前提。 "When the pivot is chosen as the average of min value and max value of the list you get a worst case O(n log n)" is simply untrue.你得到 O(n log n) 的 平均 行为,但你得到它的时间要多得多。仍然存在行为为 O(n^2) 的退化案例。 某些枢轴选择的问题是退化案例之一是已经排序的案例,这很常见。而且没有 '2*O(n)' 这样的东西。
标签: algorithm sorting quicksort