我的代码几乎正常工作,给我一个近乎整理的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);
}
}
建议?
答案 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--;
}