Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java LinkedList的递归快速排序_Java_Algorithm_Recursion_Linked List_Quicksort - Fatal编程技术网

Java LinkedList的递归快速排序

Java LinkedList的递归快速排序,java,algorithm,recursion,linked-list,quicksort,Java,Algorithm,Recursion,Linked List,Quicksort,我一直在尝试在我的算法中使用LinkedList实现递归快速排序。然而,当我运行该方法时,即使是一个小列表(包含10个元素),它似乎也会一直持续下去,我一直在等待该方法停止大约10分钟 这就是问题中的代码 public static void QuickSort(LinkedList<Contacto> Lista, int ini, int fin){ Contacto pivote, aux; int i, j, comp; if (ini<fi

我一直在尝试在我的算法中使用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);
    }
}
publicstaticvoidquicksort(LinkedList-Lista、int-ini、int-fin){
触点枢轴,辅助;
int i,j,comp;

如果(ini如注释中所述,对一个包含十项的列表进行排序需要十分钟的事实是由于某个地方的错误,我建议您插入一些断点/
println()
语句,以了解您的方法是如何进行的(每个条件句顶部的一个应该足以显示挂起的位置)

这就是说,极短列表的效率低下是quicksort算法的一个已知问题——如果你思考一下该算法是如何工作的,你就会明白为什么它是一个固有的问题(我可以对此进行阐述,但如果你自己弄清楚原因,你会过得更好)

这个问题的一个常见解决方案是使用截止:当列表的大小小于截止大小时,切换到一个简单的插入排序来完成这项工作。关于这一点有很好的讨论,并且是一个很好的示例实现

请注意该示例中
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...
private静态void快速排序(可比[]a,int left,int right){
最终整数截止=3;
如果(右-左+1<截止){//如果剩下的元素少于三个:
插入排序(a、左、右);
否则{//快速排序。。。

(注意:第一个链接来自普林斯顿大学的一些人写的。我不能推荐那个网站,因为你正在通过基本算法进行推理。)

您是否尝试设置断点并跟踪代码以查看发生了什么?我认为如果在一个小列表上花费很长时间,那么您可能会有一个无限循环或其他问题。这不是答案,但为什么要在链接列表上使用快速排序?在我的计算机科学课程中,合并排序是链接列表的更好选择。@Co对于我的学校项目,我们需要同时使用合并排序和快速排序。