Java快速排序算法不能正常工作
我有两个Arraylist,由于第二个Arraylist(类型为double)中的值,所以应该按降序排序。基本上不考虑第一个Arraylist的值,但是第一个Arraylist中的元素映射到第二个Arraylist中的元素,因此两个数组都应该根据Arraylist 2中的值进行排序。(我希望这或多或少是清楚的) 问题: 不知何故,当我在排序后打印出Arraylist2的值(带有双值)时,它们完全没有排序,但排序前的顺序不同。我还编写了一些调试system.outs,它向我展示了算法正在运行,但我不知道,为什么它不能正确排序,我希望有人能看到问题出在哪里 代码: 呼叫+输出代码:Java快速排序算法不能正常工作,java,algorithm,quicksort,Java,Algorithm,Quicksort,我有两个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 这些变化:
l
更改为pivot
。您正在比较一个值和一个索引<代码>i
是正确的,所以我想那只是一个糟糕的结果if(nutzen.get(a)>pivot)
更改为if(nutzen.get(a)
。在这一点上,我需要花更多的时间找出原因,我还有其他事情需要做。我所知道的是,它没有以另一种方式工作,呵呵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