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!");
    }

}