Java 快速排序轴心点

Java 快速排序轴心点,java,quicksort,Java,Quicksort,对于快速排序(在java中,如果有关系的话),轴心点(或轴心索引)的数量与给定数组的大小之间是否存在关系?例如,如果数组大小为10,是否总是会有(比如)5个枢轴点 是的,大约n/2是正确的。然而,我不知道这有什么关系。你可以有多少个支点(我想最多n个…) 支点越多,下一次递归的效率就越高,尽管如果它太大(特别是如果它是非常量的话),找到支点的时间会比得到的时间多 我相信典型的情况是每个迭代有3个潜在的支点,但这完全取决于实现 但请记住,在最坏的情况下,您将以n次迭代结束(快速排序的最坏情况是O(

对于快速排序(在java中,如果有关系的话),轴心点(或轴心索引)的数量与给定数组的大小之间是否存在关系?例如,如果数组大小为10,是否总是会有(比如)5个枢轴点

是的,大约n/2是正确的。然而,我不知道这有什么关系。

你可以有多少个支点(我想最多n个…)

支点越多,下一次递归的效率就越高,尽管如果它太大(特别是如果它是非常量的话),找到支点的时间会比得到的时间多

我相信典型的情况是每个迭代有3个潜在的支点,但这完全取决于实现

但请记住,在最坏的情况下,您将以n次迭代结束(快速排序的最坏情况是
O(n^2)
)。这自然需要n个支点,而每次迭代所做的工作非常少


现在,在上一次迭代中,您可以预期大约有n/3个枢轴。在上面的迭代中,它将是n/6。在下一次迭代中,它将是n/12。如果你接受了这个系列的限制,你最终会重复.6。所以看起来你可以期望2/3N的总支点(因为你有大约2/3N的总迭代)

不一定。这取决于数据和您的算法。平均而言,对于一个适当的随机数据和一个适当的实现,它应该是在log2(n)支点的顺序上。

我必须(对于一个赋值)将堆栈实现到一个快速排序程序中。这个程序有一个分区方法和一个交换方法,它实际上执行排序,但是管理创建的分区的起始索引和大小是我对堆栈所要做的,在这个赋值之前,我只会递归地执行,但现在这不是一个选项。这个数字与while循环运行的时间有关,在while循环中,我推送、弹出并调用方法分区,如上所述。如果使用堆栈而不是递归,即使用线程的堆栈,则当堆栈为空时停止,即没有其他事情要做。当堆栈的大小取决于树的深度(顺序为log2(n))时,轴心点的数量就像树数据结构上的叶子数量。因此,我不认为知道轴点的数量有多有用。我不认为3个轴在一个数组(整数)大小上(可靠地,始终)有效,比如,1000@mcwillig您可能会以一两次糟糕的迭代结束,但它(平均而言)会在下一次迭代中自行解决。如果每次迭代有3个潜在的轴心点,那么在下一次迭代中,每边都会有3个以上的轴心点。所以如果一个变小了,哦,好吧,它会更快完成。只要你通常把某处一分为二,你就很好。你通常选择三者的中间值。