我一直在尝试将Recursive Quicksort实现到我使用LinkedList的算法中。然而,当我运行该方法时,它似乎永远地继续进行,即使是一个小的列表(10个元素),我一直在等待该方法停止大约10分钟。
这是有问题的代码
public static void QuickSort(LinkedList<Contacto> Lista, int ini, int fin){
Contacto pivote, aux;
int i, j, comp;
if (ini<fin){
pivote = Lista.get(ini);
i=ini+1;
j=fin;
while (i<j){
while(i<fin && (comp=Lista.get(i).get_name().compareTo(pivote.get_name()))<=0 )
i++;
while((comp=Lista.get(i).get_name().compareTo(pivote.get_name()))>0 )
j--;
if(i<j){
aux = Lista.get(i);
Lista.set(i, Lista.get(j));
Lista.set(j, aux);
}
}
aux=Lista.get(j);
Lista.set(j,pivote);
Lista.set(ini,aux);
QuickSort(Lista,ini,j-1);
QuickSort(Lista,j+1,fin);
}
}
感谢您的帮助!
答案 0 :(得分:0)
正如评论中所指出的那样,十分钟对十个项目列表进行排序这一事实是由于某个地方出现了错误,我建议您插入一些断点/ println()
语句可以了解您的方法的进展情况(每个条件的顶部都应该足以显示它被挂起的位置)。
也就是说,使用非常短的列表的低效率是快速排序算法的一个已知问题 - 并且,如果您考虑算法如何工作,您可以看到它为什么是固有的。 (我可以对此进行阐述,但如果你弄明白自己为什么,你会变得更好)。
此问题的常见解决方案是使用 cutoff :当列表的大小小于截止大小时,切换到简单的插入排序以完成作业。关于这个here进行了很好的讨论,并且是一个非常好的示例实现here。
请注意该示例中quicksort()
方法的前几行:
private static void quicksort(Comparable [] a, int left, int right) {
final int CUTOFF = 3;
if (right-left+1 < CUTOFF) { // if less than three elements remain:
insertionSort(a,left,right);
else { //quicksort...
(注意:第一个链接来自普林斯顿的一些人写的the booksite for Algorithms, 4th edition。我不能推荐那个网站,因为你通过基本算法进行了推理)