我读到可以在O(nlogn)
进行快速排序算法在每一步说明选择中位数作为支点
但是,假设我们有这个数组:
10 8 39 2 9 20
哪个值是中位数?
在数学中,如果我记得正确的话,中位数是(39 + 2)/ 2 = 41/2 = 20.5
虽然
我的数组中没有20.5提前致谢
答案 0 :(得分:4)
你可以选择其中任何一个;如果您将输入视为限制,那么随着它的扩大而无关紧要。
答案 1 :(得分:1)
我们在这里讨论算法描述的确切措辞,而且我没有你所指的文字。但我认为在上下文中它们可能意味着“中位数”,而不是列表中值的数学中位数,而是列表中的中间点,即中位数INDEX,在此cade中将为3或4.作为coffNjava说,你可以带任何一个。
答案 2 :(得分:0)
实际上是通过首先对数组进行排序来找到中位数,因此在您的示例中,通过将数字排列为2 8 9 10 20 39找到中位数,中位数将是两个中间元素的平均值,(9+ 10)/ 2 = 9.5,这对你没有任何帮助。使用中位数是一种理想的情况,但如果数组至少已经部分排序,我会这样做。
使用偶数数组,您无法找到确切的轴心点,因此我相信您可以使用任一中间数字。它会略微提高效率,但不会大幅度提高,除非你总是最终对数组进行排序。
答案 3 :(得分:0)
找到未排序数字的中位数可以在O(N)时间内完成,但为了快速排序的目的,找不到真正的中位数并不是必需的。你只需找到一个合理的支点。
作为Wikipedia entry for quicksort says:
在quicksort的早期版本中,通常会选择分区最左边的元素作为pivot元素。不幸的是,这会导致已经排序的数组的最坏情况行为,这是一个相当常见的用例。通过选择枢轴的随机索引,选择分区的中间索引或(特别是对于较长的分区)选择分区的第一个,中间和最后一个元素的中位数(如建议的那样),可以轻松解决问题。 R. Sedgewick)。
找到三个值的中位数比找到整个值集合要容易得多,对于具有偶数个元素的集合,找到两个“中间”元素中的哪一个并不重要潜在的支点。