在Hoare算法的规范实现中,我们需要数组的起始和结束元素作为参数,并且算法为分区数组的开始和结束维护了几个标志。以下是我发现的一些标准动作: QuickSort and Hoare Partition Hoare Partition Correctness in java
现在,我做了以下操作,并使用一些随机数组对其进行了测试。我不太确定我做错了什么 - 这个实现中有漏洞吗?它的直观感觉与上面的实现非常相似,只是它需要较少的参数。与标准实现相比,它是否具有更好/更差的性能(甚至是稍差)? (尽管如此,是的,这两个都是O(n))
(MATLAB)
function partition(m_input)
pivot = m_input(1);
size = length(m_input);
flag = 1;
k = 1;
while(k<=size)
if(m_input(k)>pivot)
swap(m_input(size), m_input(k))
size = size-1;
else
swap(m_input(k), m_input(flag))
flag =k;
k=k+1;
end
end
end
编辑:输入已更改为 m_input 。
答案 0 :(得分:0)
我总是喜欢标准的Hoare的实现。如果你看一下它,它不是很直观,但它有一个明显的优势:交换数量减少。虽然你的实现总是有效地进行N次比较和N次交换,但Hoare的实现只进行了N次比较,但如果不需要则不会交换任何内容。
在某些情况下差异很大。首先,在您使用环境的情况下,交换或赋值变量/对象是一个costy操作。例如,如果您将C / C ++与对象数组一起使用。另一个典型的例子,如果数组中的许多项具有相同的值,或者当数组几乎已经排序并且只需要交换几个项时,Hoare的分区实现就会表现得更好。在那种情况下,Hoare的版本几乎不执行交换,而您的版本仍然需要交换N个项目,这需要N * 3个分配指令。