如何更改以下快速排序代码以便我可以使用随机数据块?

时间:2015-12-02 14:45:47

标签: java

如何更改以下快速排序代码,以便我可以使用随机轴而不是中间整数轴?

public ArrayList<Integer> quicksort(ArrayList<Integer> input){

    if(input.size() <= 1){
        return input;
    }

    int middle = (int) Math.ceil((double)input.size() / 2);

    ##int randomint= arrayList.get(random.nextInt(arrayList.size()));##
    ##I WANT TO USE THIS RANDOMINT AS A PIVOT##

    int pivot = input.get(middle);

    ArrayList<Integer> less = new ArrayList<Integer>();
    ArrayList<Integer> greater = new ArrayList<Integer>();

    for (int i = 0; i < input.size(); i++) {
        if(input.get(i) <= pivot){
            if(i == middle){
                continue;
            }
            less.add(input.get(i));
        }
        else{
            greater.add(input.get(i));
        }
    }

    return concatenate(quicksort(less), pivot, quicksort(greater));
}

private ArrayList<Integer> concatenate(ArrayList<Integer> less, int pivot, ArrayList<Integer> greater){

    ArrayList<Integer> list = new ArrayList<Integer>();

    for (int i = 0; i < less.size(); i++) {
        list.add(less.get(i));
    }

    list.add(pivot);

    for (int i = 0; i < greater.size(); i++) {
        list.add(greater.get(i));
    }

    return list;
}

我想使用randomint作为支点。当我尝试直接替换randomint时,我得到Array超出绑定的异常。感谢。

1 个答案:

答案 0 :(得分:0)

如果您更改以下行:

int randomint= arrayList.get(random.nextInt(arrayList.size()));

int randomint= random.nextInt(input.size());
int pivot = input.get(randomint);

如果我的怀疑是正确的,那么这应该给你一个你正在寻找的随机支点。