Extract smaller methods
Methods should only do one thing. In other answers it was already pointed out that for example the swapping mechanism can be extracted into its own method. This couldn't be more true, the quicksort
method has no business knowing about how to swap two variables in an array.
Variable declaration
Refrain from declaring multiple variables on a single line. It's less readable and you're making one line do multiple things. Declare each variable on its own line.
Give your variables more meaningful names and declare them in the innermost scope possible, as demonstrated by palacsint. Variable names that are only one or two characters long are bad as a rule.
Comments
Do document your code, particularly public or package-restricted methods. See the following example:
/**
*
* @param array An array of integers that is to be sorted.
* @param lowerBound The lower index of the region of the array that is to
* be sorted.
* @param upperBound The upper index of the region of the array that is to
* be sorted.
*/
void quicksort(int[] array, int lowerBound, int upperBound) {
Don't rely on comments to make it clear what your code does. Methods should be short, simple and only do one thing. With the help of meaningful variable and method names and good documentation, it shouldn't be hard to figure out what the method does. You will not need comments.
Brackets
With if-statements or loops that have only one line in their body, it's sometimes tempting to omit brackets. Do use them anyway. It will make your code a few lines longer, but it will help readability. Also, it'll be easier to add more lines to the body afterwards.