在Quicksort,Java中使用随机数据透视表

时间:2014-02-26 14:32:52

标签: java quicksort

我的代码几乎正常工作,给我一个近乎整理的outdata。 cmp(i,j)方法返回负值if i < j和正if j > i

代码:

public void sort(){ 
    sortQuick(0, getElementCount()-1);
}
public void sortQuick (int first, int last){
    // pivot tilldelas ett värde mellan noll och antal element i vektorn.
    final Random random = new Random();
    System.out.println(("Last: " + last + ", first : " + first));
    int up = first;                          
    int down = last; 

    int pivot = random.nextInt(last-first) + first;
    System.out.println(pivot);                          
    while (up < down ) {

        while (cmp(up,pivot) < 0) {
            up++;
        }
        while (cmp(down,pivot) > 0) {
            down--;
        }
        if (up <= down) {
            swap(up,down);
            up++;
            down--;
        }
    }
    if (down > first) {
        sortQuick(first, down);
    }
    if (last > up) {
        sortQuick(up, last);
    }
}

建议?

1 个答案:

答案 0 :(得分:1)

问题是您只存储了pivot元素的索引而不是实际值。

如果算法的后期,up(或down)恰好达到值pivot且受到交换的影响,则索引pivot的值会发生变化。因此,后续比较针对不同的枢轴元素。

记住枢轴值并对其进行所有比较,例如:

int pivotIndex = random.nextInt(last-first) + first;
int pivotValue = getValueAt(pivotIndex);

while (up < down ) {

    while (getValueAt(up) < pivotValue) {
        up++;
    }
    while (getValueAt(down) > pivotValue) {
        down--;
    }
    if (up <= down) {
        swap(up,down);
        up++;
        down--;
    }

或者,您可以在交换时更新数据透视索引:

    if (up <= down) {
        swap(up,down);
        if(pivot == up) { pivot = down; }
        else if(pivot == down) { pivot = up; }
        up++;
        down--;
    }