Java中不排序的快速排序算法
我编写了一个从网站上获得的快速排序算法 我遵循了第一个算法,我的代码是这样的:Java中不排序的快速排序算法,java,algorithm,Java,Algorithm,我编写了一个从网站上获得的快速排序算法 我遵循了第一个算法,我的代码是这样的: private static ArrayList<Integer> copy; public static ArrayList<Integer> concatenate(ArrayList<Integer> a, ArrayList<Integer> b, ArrayList<Integer> c) { ArrayList<Integer&g
private static ArrayList<Integer> copy;
public static ArrayList<Integer> concatenate(ArrayList<Integer> a, ArrayList<Integer> b, ArrayList<Integer> c) {
ArrayList<Integer> result = new ArrayList<Integer>();
for(int i = 0; i < a.size(); i++)
result.add(a.get(i));
for(int i = 0; i < b.size(); i++)
result.add(b.get(i));
for(int i = 0; i < c.size(); i++)
result.add(c.get(i));
return result;
}
public static void quickSort(ArrayList<Integer> a) {
ArrayList<Integer> less = new ArrayList<Integer>();
ArrayList<Integer> greater = new ArrayList<Integer>();
ArrayList<Integer> equal = new ArrayList<Integer>();
Random rand = new Random();
if(a.size() > 1) {
int pivot = a.get(rand.nextInt(a.size()-1));
for(int i = 0; i < a.size(); i++) {
if(a.get(i) < pivot)
less.add(a.get(i));
if(a.get(i) == pivot)
equal.add(a.get(i));
if(a.get(i) > pivot)
greater.add(a.get(i));
}
quickSort(less);
quickSort(greater);
a = concatenate(less, equal, greater);
}
copy = a;
}
我的代码或算法有问题吗?查看您提供的链接中的Java示例,您的代码和示例之间有一些不同之处 您的函数不返回列表,而是返回void,请尝试使函数返回列表,然后将此返回分配给less and more,而不仅仅是调用“quickSort(less)”或“quickSort(more)”。例如,在示例中:
// Recursively sort sublists
less = quickSort(less);
more = quickSort(more);
也许您只调用了一次排序,所以只对列表的一部分进行排序,从您的输出来看确实如此。确保每次都返回列表,而不仅仅是对每个列表进行递归排序,然后不将其链接到以前调用的列表。在所有quickSort的递归调用之后,它返回到第一次调用的最后一行,并简单地覆盖a的值,并连接更小、相等和更大的值,忽略迭代中以前完成的所有工作,因此,您只是得到第一次排序的结果。在
快速排序
函数的最后一行中,有一个对复制
列表的重写,该列表将在每次递归调用中执行,从而丢失所有更改
copy = a;
正如dahui所说,尝试创建一个快速排序函数,返回排序后的列表。您可以在IDE中复制并粘贴这段代码,希望它能工作:)(我拉出了随机变量,以防止在每次递归调用中创建它)
import java.util.Random;
导入java.util.List;
导入java.util.array;
导入java.util.ArrayList;
公共类快速排序{
//用于选择随机轴
私有静态随机兰德=新随机();
公共静态ArrayList连接(ArrayList a、ArrayList b、ArrayList c){
ArrayList结果=新建ArrayList();
对于(int i=0;i1){
int pivot=a.get(rand.nextInt(a.size()-1));
对于(int i=0;i枢轴)
增加(a.get(i));
}
less=快速排序(less);
较大=快速排序(较大);
a=串联(更小、相等、更大);
}
返回a;
}
公共静态void main(字符串参数[]){
System.out.println(“***开始快速排序***\n”);
ArrayList numbers=新的ArrayList(Arrays.asList(新整数[]{2,5,9,3,3,2,0,8,1,5}));
System.out.println(“未排序:\t”+数字);
System.out.println(“排序:\t”+快速排序(数字));
System.out.println(“\n***排序已完成。祝您愉快!”);
}
}
您是否调试了该函数以识别有问题的行?请注意,只需使用list.addAll(另一个列表)
即可跳过concatenate()
中循环的行。似乎没有问题的线条。无论您的算法是什么,所提供的代码都有一些问题。重新考虑实例变量,更不用说类变量了。使用“foreach”-循环,“if-else_if-else”,泛型,…我更改了代码,它工作了!对不起,如果问题写得很糟糕,请不要担心。可能需要对递归进行更多的了解,以便您确切地了解它是如何工作的。如果这个答案有帮助,你能把它标记为正确答案吗。对不起,我是新手。谢谢路易斯,不用担心:)
import java.util.Random;
import java.util.List;
import java.util.Arrays;
import java.util.ArrayList;
public class Quicksort {
// For selecting random pivot
private static Random rand = new Random();
public static ArrayList<Integer> concatenate(ArrayList<Integer> a, ArrayList<Integer> b, ArrayList<Integer> c) {
ArrayList<Integer> result = new ArrayList<Integer>();
for(int i = 0; i < a.size(); i++)
result.add(a.get(i));
for(int i = 0; i < b.size(); i++)
result.add(b.get(i));
for(int i = 0; i < c.size(); i++)
result.add(c.get(i));
return result;
}
public static ArrayList<Integer> quickSort(ArrayList<Integer> a) {
ArrayList<Integer> less = new ArrayList<Integer>();
ArrayList<Integer> greater = new ArrayList<Integer>();
ArrayList<Integer> equal = new ArrayList<Integer>();
if(a.size() > 1) {
int pivot = a.get(rand.nextInt(a.size()-1));
for(int i = 0; i < a.size(); i++) {
if(a.get(i) < pivot)
less.add(a.get(i));
if(a.get(i) == pivot)
equal.add(a.get(i));
if(a.get(i) > pivot)
greater.add(a.get(i));
}
less = quickSort(less);
greater = quickSort(greater);
a = concatenate(less, equal, greater);
}
return a;
}
public static void main(String args[]) {
System.out.println("*** Starting Quicksort ***\n");
ArrayList<Integer> numbers = new ArrayList<Integer>(Arrays.asList(new Integer[]{2, 5, 9, 3, 3, 2, 0, 8, 1, 5}));
System.out.println("Unsorted:\t" + numbers);
System.out.println("Sorted: \t" + quickSort(numbers));
System.out.println("\n*** Sorting finalized. Have a good day!");
}
}