Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.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快速排序算法不能正常工作_Java_Algorithm_Quicksort - Fatal编程技术网

Java快速排序算法不能正常工作

Java快速排序算法不能正常工作,java,algorithm,quicksort,Java,Algorithm,Quicksort,我有两个Arraylist,由于第二个Arraylist(类型为double)中的值,所以应该按降序排序。基本上不考虑第一个Arraylist的值,但是第一个Arraylist中的元素映射到第二个Arraylist中的元素,因此两个数组都应该根据Arraylist 2中的值进行排序。(我希望这或多或少是清楚的) 问题: 不知何故,当我在排序后打印出Arraylist2的值(带有双值)时,它们完全没有排序,但排序前的顺序不同。我还编写了一些调试system.outs,它向我展示了算法正在运行,但我

我有两个Arraylist,由于第二个Arraylist(类型为double)中的值,所以应该按降序排序。基本上不考虑第一个Arraylist的值,但是第一个Arraylist中的元素映射到第二个Arraylist中的元素,因此两个数组都应该根据Arraylist 2中的值进行排序。(我希望这或多或少是清楚的)

问题:

不知何故,当我在排序后打印出Arraylist2的值(带有双值)时,它们完全没有排序,但排序前的顺序不同。我还编写了一些调试system.outs,它向我展示了算法正在运行,但我不知道,为什么它不能正确排序,我希望有人能看到问题出在哪里

代码:

呼叫+输出代码:

            String str = "";
        // DEBUG //
        for(int k = 0; k < test.size(); k++) {
            str += " " + test.get(k);   
        }
        System.out.println(str);
        System.out.println("------------------------------------------------------------------/r/n");
        sort(items, test, 0 ,(test.size() -1));
        String str2 = "";
        for(int k = 0; k < test.size(); k++) {
            str2 += " " + test.get(k);  
        }
        System.out.println(str2);
        // DEBUG //

自从我编写排序算法(哦,完整API的乐趣)以来已经有很长时间了,但这让我感到奇怪

       } while(j > l && nutzen.get(i) < l);
}while(j>l&&nutzen.get(i)
那不是更好吗

       } while(j > l && nutzen.get(i) < pivot);
}while(j>l&&nutzen.get(i)

不管怎样,这是一个建议。与其尝试对10个数字进行排序,只报告退出,不如尝试使用3或4,更认真地调试代码的内部工作(在每个步骤中,选择哪个轴,生成的子列表是什么,等等)。

我刚刚开始,所以我以前没有真正研究过快速排序,但我认为我已经成功了。只是需要调整我评论的4行。另外,我把l改成了左边,把r改成了右边,把I改成了a,把j改成了z,这样我就更容易跟踪了。正如我所说的,在我主修comp-sci的第一年,我仍然是一个noob,所以我不能评论这个实现有多好。这对我来说似乎是一个很好的问题,我需要努力学习。希望它能帮你解决一些问题,而不是太“这就是答案”——ish

这些变化:

  • 将左右计数器进一步“向外”偏移1到 说明它们在 比较。似乎没有像以前那样解析整个范围。可能已将内部do..while循环更改为while 循环以获得相同的效果
  • l
    更改为
    pivot
    。您正在比较一个值和一个索引<代码>i
    是正确的,所以我想那只是一个糟糕的结果
  • if(nutzen.get(a)>pivot)
    更改为
    if(nutzen.get(a)
    。在这一点上,我需要花更多的时间找出原因,我还有其他事情需要做。我所知道的是,它没有以另一种方式工作,呵呵
  • 我没有发疯去测试它,但它似乎确实有效。我复制了您的6个样本值并进行了尝试,结果成功了。祝你好运

    private static int partition(ArrayList<Double> items, ArrayList<Double> nutzen, int left, int right, double pivot) {
        int a = left-1; //offset to account for do..while incrementing prior to comparison
        int z = right; //offset to account for do..while decrementing prior to comparison
        do {
            do {
                a++;
            } while(a < right && nutzen.get(a) > pivot);
    
            do {
                z--;
            } while(z > left && nutzen.get(z) < pivot); //compare to pivot, not index
    
            if(a < z) {
                double tmp  = nutzen.get(a);
                Double tmp2 = items.get(a);
                nutzen.set(a, nutzen.get(z));
                nutzen.set(z, tmp);
                items.set(a, items.get(z));
                items.set(z, tmp2);
            }
        } while(a < z);
    
        if (nutzen.get(a) < pivot) {  //changed > to <
            double tmp  = nutzen.get(a);
            Double tmp2 = items.get(a);
            nutzen.set(a, nutzen.get(right));
            nutzen.set(right, tmp);
            items.set(a, items.get(right));
            items.set(right, tmp2);
        }
        return a;       
    }
    
    .22540250447227192 0.5289855072463768 0.3245742092457421 0.35105028644175684 0.3773755656108597 0.2041172365666434
    ------------------------------------------------------------------
    0.5289855072463768 0.3773755656108597 0.35105028644175684 0.3245742092457421 0.22540250447227192 0.2041172365666434
    
    private静态int分区(ArrayList项、ArrayList nutzen、int left、int right、双枢轴){
    int a=left-1;//在比较之前递增时,用于说明do..的偏移量
    int z=right;//在比较之前递减时,要考虑do..的偏移量
    做{
    做{
    a++;
    }而(apivot);
    做{
    z--;
    }while(z>left&&nutzen.get(z)为<
    双tmp=nutzen.get(a);
    Double tmp2=items.get(a);
    nutzen.set(一个,nutzen.get(右));
    nutzen.set(右,tmp);
    items.set(a,items.get(右));
    项目集(右,tmp2);
    }
    返回a;
    }
    .22540250447227192 0.5289855072463768 0.3245742092457421 0.35105028644175684 0.3773755656108597 0.2041172365666434
    ------------------------------------------------------------------
    0.5289855072463768 0.3773755656108597 0.35105028644175684 0.3245742092457421 0.22540250447227192 0.2041172365666434
    
    我认为正确的处理方法是创建一个实例同时包含这两个值的类,并使其以只考虑第二个值的方式实现
    Comparable
    compareTo()
    。请您提供一些示例输出来说明您的问题。我同意创建一个组合这些值的类的建议。如果第二个值顺序不是该类的自然顺序,则使用基于第二个值的比较器进行排序。建议使用Thanx。不幸的是,我不能这样做,因为这是大学的作业,我们不允许开设新课程。不过我添加了示例输出和输出代码,希望现在有人能找到错误
           } while(j > l && nutzen.get(i) < pivot);
    
    private static int partition(ArrayList<Double> items, ArrayList<Double> nutzen, int left, int right, double pivot) {
        int a = left-1; //offset to account for do..while incrementing prior to comparison
        int z = right; //offset to account for do..while decrementing prior to comparison
        do {
            do {
                a++;
            } while(a < right && nutzen.get(a) > pivot);
    
            do {
                z--;
            } while(z > left && nutzen.get(z) < pivot); //compare to pivot, not index
    
            if(a < z) {
                double tmp  = nutzen.get(a);
                Double tmp2 = items.get(a);
                nutzen.set(a, nutzen.get(z));
                nutzen.set(z, tmp);
                items.set(a, items.get(z));
                items.set(z, tmp2);
            }
        } while(a < z);
    
        if (nutzen.get(a) < pivot) {  //changed > to <
            double tmp  = nutzen.get(a);
            Double tmp2 = items.get(a);
            nutzen.set(a, nutzen.get(right));
            nutzen.set(right, tmp);
            items.set(a, items.get(right));
            items.set(right, tmp2);
        }
        return a;       
    }
    
    .22540250447227192 0.5289855072463768 0.3245742092457421 0.35105028644175684 0.3773755656108597 0.2041172365666434
    ------------------------------------------------------------------
    0.5289855072463768 0.3773755656108597 0.35105028644175684 0.3245742092457421 0.22540250447227192 0.2041172365666434