Choose the last item as a pivot, partition smaller values to its left, then recurse on the two sides.

Algorithm

Basic Implementation

Basic.java
class Basic {
	public static void main(String[] args) {
		int[] arr = new int[] { 4, 1, 5, 2, 3 };
		quickSort(arr, 0, arr.length - 1);
		printArray(arr);
	}

	static void printArray(int[] arr) {
		System.out.print("[");
		for (int i = 0; i < arr.length; i++) {
			if (i > 0) System.out.print(", ");
			System.out.print(arr[i]);
		}
		System.out.println("]");
	}
	static int partition(int[] arr, int low, int high) {
		int pivot = arr[high];
		int i = low - 1;
		for (int j = low; j < high; j++) {
			if (arr[j] <= pivot) {
				i++;
				int tmp = arr[i]; arr[i] = arr[j]; arr[j] = tmp;
			}
		}
		int tmp = arr[i + 1]; arr[i + 1] = arr[high]; arr[high] = tmp;
		return i + 1;
	}

	static void quickSort(int[] arr, int low, int high) {
		if (low < high) {
			int pivotIndex = partition(arr, low, high);
			quickSort(arr, low, pivotIndex - 1);
			quickSort(arr, pivotIndex + 1, high);
		}
	}
}

The pinned first partition uses [4, 1, 5, 2, 3] with pivot 3. The diagrams track the boundary, swaps, and recursive ranges.

Step 1 - Choose the last value as pivot

The pivot is arr[4] = 3, and i starts just before the current range.

Initial partition state for [4, 1, 5, 2, 3].i0i1i2i3i441523j startspivot

Step 2 - Swap small values left

1 and 2 are <= pivot, so they move into the left partition.

After scanning values before the pivot: [1, 2, 5, 4, 3].i0i1i2i3i412543<= 3<= 3> 3> 3pivot

Step 3 - Place pivot, then recurse

Swapping pivot 3 into index 2 gives [1, 2, 3, 4, 5]; recurse on [1, 2] and [4, 5].

Pivot lands at index 2 and splits the remaining work.left rangepivotright range[1, 2]3 at i2[4, 5]quick_sort(0,1)fixedquick_sort(3,4)

Complexity

  • Time: O(n^2) worst, O(n log n) average
  • Space: O(log n) average call stack
  • Stable: no

Implementation notes

  • Java stores the sortable data in one primitive int[] and quickSort mutates that array in place over inclusive low/high bounds. Recursion stops when low < high is false.
  • partition chooses the last element, arr[high], as the pivot, initializes i = low - 1, and scans j from low while j < high.
  • When arr[j] <= pivot, the code increments i and swaps arr[i] with arr[j] using a local primitive int tmp; after the scan, it swaps arr[i + 1] with the pivot slot and returns i + 1.
  • The replay exposes the first partition states: 1 and 2 move left of pivot 3, then the pivot lands at index 2 before recursive calls cover [1, 2] and [4, 5]. Aside from call-stack frames, the sort uses local primitives and creates no ongoing JVM GC pressure.
pivot The final element is moved to the boundary between smaller and larger values.
partition One scan rearranges the current range before the recursive calls.