Seems like it should be pretty straightforward, I've done quick sort before, but I've got some bug in my code, and I can't quite find it. Here's my code:
public static void quickSortInPlace(ArrayList<Integer> numbers, int left, int right) {
if(left < right) {
int index = generatePivot(numbers);
index = partition(numbers, left, right, index);
quickSortInPlace(numbers, left, index - 1);
quickSortInPlace(numbers, index + 1, right);
}
}
public static int partition(ArrayList<Integer> numbers, int left, int right, int index) {
int pivot = numbers.get(index);
int tmp = numbers.get(right);
numbers.set(right, numbers.get(index));
numbers.set(index, tmp);
int newIndex = left;
for(int i = left; i < right; i++) {
if(numbers.get(i) <= pivot) {
tmp = numbers.get(i);
numbers.set(i, numbers.get(newIndex));
numbers.set(newIndex, tmp);
newIndex++;
}
}
tmp = numbers.get(newIndex);
numbers.set(newIndex, numbers.get(right));
numbers.set(right, tmp);
return newIndex;
}
//Chooses an index in the array for the pivot value. Randomly picks 3 values from the array, and chooses the intermediate value. This is simply an optimization.
public static int generatePivot(ArrayList<Integer> numbers) {
Random rand = new Random();
int rand1 = rand.nextInt(numbers.size()), rand2 = rand.nextInt(numbers.size()), rand3 = rand.nextInt(numbers.size());
int pivot1 = numbers.get(rand1), pivot2 = numbers.get(rand2), pivot3 = numbers.get(rand3);
int max = Math.max(Math.max(pivot1, pivot2), pivot3);
int min = Math.min(Math.min(pivot1, pivot2), pivot3);
int pivot = pivot1 ^ pivot2 ^ pivot3 ^ max ^ min;
int index = 0;
if(pivot == pivot1) {
index = rand1;
} else if(pivot == pivot2) {
index = rand2;
} else if(pivot == pivot3) {
index = rand3;
}
return index;
}
I'm giving the method quickSortInPlace an ArrayList filled with 10,000 randomly generated integers simply for the purpose of checking the correctness of the code. I would expect it to spit out an ordered ArrayList of 10,000 integers.
I've been looking over it for like 45 minutes now, so I'm sure it's something stupid, and I just can't see it because I've been looking at it so long. It just returns utter garbage. Any help would be greatly appreciated. Thanks!