如何在java中找到中位数的中位数以便快速实施

时间:2012-04-03 13:26:45

标签: java

因此,我一直在为整夜作业分配正确实施快速排序算法,在搜索了几个小时后,我找不到中间分区的具体实现。所以,我陷入了一个巨大的障碍,我不知道我的算法的哪一部分被严重破坏,并且由于所有在线算法都是伪代码(因此他们对分区的描述极其模糊),所以它是不可能的我检查一下我的实施情况。所以这是我的弗兰肯斯坦代码之后阅读文档后文件中的中位数枢轴选择的中位数如何与java中的快速排序一起使用。

到目前为止,这是迄今为止我发现的唯一远程帮助的唯一来源,并且他们对于使算法有效的部分都非常模糊,故意花费这么多时间搜索后会出现这种情况:

http://mitpress.mit.edu/algorithms/solutions/chap9-solutions.pdf

http://www.cs.umd.edu/~meesh/351/mount/lectures/lect9-medians-selection.pdf

* HTTP://www.ics.uci.edu/~eppstein/161/960130.html

* HTTP://en.wikipedia.org/wiki/Selection_algorithm

这是我的快速排序算法:

{Removed Code}

这是我的选择方法,我认为可怕的混乱部分是我如何选择中位数和中位数的中位数,但我找不到任何在线指导我的分区:

{Removed Code}

另外,对于我的分区,我使用了常规的快速分区方法但稍微改了一下,因此将枢轴作为参数给出,我不知道是否还有其他我应该做的事,因为所有在线源都是模糊的在这方面也是:

{Removed Code}

以下是我对5组进行排序的插入排序,以防万一:

{Removed Code}

任何洞察我搞砸了算法的哪一部分都会非常感激,因为我一直在撞墙试图发现什么是错的。在选择算法中肯定存在一个巨大的错误,因为我的JUnit测试在[1..100]的预排序数组中失败,用于选择预期结果为50的中位数,但我的算法总是吐出54.

1 个答案:

答案 0 :(得分:0)

你应该从5元素“子集”中选择中位数,然后选择它旁边的元素:中位数将具有索引2,但你选择索引3。你需要:

int median = subset[2]; // Or sslength/2 if you don't like hardcoded values

顺便说一下,[1..100]的“中位数中位数”将是48或53,而不是50.将数字写在5乘20的网格中:中间行的值(3,8) ,13,...)是“子集”的中位数。