Java Quicksort数据透视表选择

时间:2011-06-24 14:31:13

标签: java sorting pivot quicksort

因此,当以不同的方式选择枢轴时,我选择除了传入的arraylist中的最后一个元素之外的任何东西都会遇到堆栈溢出错误。在“3的中位数”类型的选择是它发生最多的地方。

public static <T> void quickSort (ArrayList<T> incomingArray, Comparator<? super T> cmp, int start, int end)
{
    if(start >= end) 
        return;

    T pivot = incomingArray.get(start + ((end - start)/2)); <--Stack overflow

    if(cmp.compare(incomingArray.get(start + ((end - start)/2)), incomingArray.get(0)) < 0)
    {
        swap(incomingArray, (start + ((end - start)/2)), 0);
    }
    if(cmp.compare(incomingArray.get(end), incomingArray.get(start + ((end - start)/2))) < 0)
    {
        swap(incomingArray, end, (start + ((end - start)/2)));
    }
    if(cmp.compare(incomingArray.get((start + ((end - start)/2))), incomingArray.get(end)) < 0)
    {
        swap(incomingArray, 0, end);
    }

    swap(incomingArray, (start + ((end - start)/2)), end);

    pivot = incomingArray.get(end);

    int leftBound = 0;
    int rightBound = end - 1;

    while(leftBound < rightBound)
    {
        while(cmp.compare(incomingArray.get(leftBound), pivot) <= 0 && leftBound < rightBound)
            leftBound++;
        while(cmp.compare(incomingArray.get(rightBound), pivot) >= 0 && leftBound < rightBound)
            rightBound--;

        swap(incomingArray, leftBound, rightBound);
    }

    swap(incomingArray, rightBound, end);

    quickSort(incomingArray, cmp, start, leftBound);
    quickSort(incomingArray, cmp, rightBound + 1, end);



}

交换调用只会更改传递数组中索引位置的值。

3 个答案:

答案 0 :(得分:0)

首先似乎没有问题:

if(cmp.compare(incomingArray.get((start + ((end - start)/2))), incomingArray.get(end)) < 0)
{
    swap(incomingArray, 0, end);
}

比较中间和最后一个元素但是将第一个和最后一个元素交换为

答案 1 :(得分:0)

堆栈溢出可能是由于快速排序实现中的错误造成的。如果我正确理解你的代码,我会在其中发现一些奇怪的行。

假设quicksort(start, end)将子数组从索引start排序到索引end,以下几行没有多大意义:

if (cmp.compare(incomingArray.get(start + ((end - start) / 2)), incomingArray.get(0)) < 0) {
    swap(incomingArray, (start + ((end - start) / 2)), 0);
}

此处索引0开始发挥作用,大部分时间都在startend之外。与行相同

swap(incomingArray, 0, end);

int leftBound = 0;

修复算法问题,然后重试。

答案 2 :(得分:0)

我只是复制粘贴你的代码并运行100,000个数字,我没有遇到任何堆栈溢出问题。您确定您的交换和比较功能是否按预期正常工作?