快速排序在数据序列中选择一个元素做为基准值(一般会选择第一个元素或最后一个元素),每趟从数据序列的两端开始交替进行,将小于基准值的元素交换到序列前端,将大于基准值的元素交换到序列的后端,介于两者之间的位置则成为基准值的最终位置。同时,序列被划为两个子序列,在分别对了个子序列进行快速排序,直到子序列的长度为1,则完成排序。
public static void quickSort(int[] arr, int begin, int end) { // 序列有效 if (begin >= 0 && begin < end && end < arr.length) { int i = begin, j = end; // begin 为左边最开始的元素的下标;end 为最后一个元素的下标 int x = arr[i]; // 以第一个的元素为基准 while (i != j) { // 当交叉比较时 左边和右边下标发生重合子运行结束 while (i < j && arr[j] >= x) { // 从右边向前寻找较小的值移动,不移动与基准值相等的元素 j--; } if (i < j) { arr[i++] = arr[j]; // 子序列的后端较小元素向前移动 } while (i < j && arr[i] <= x) { i++; } if (i < j) { arr[j--] = arr[i]; // 子序列前端较大的元素向后移动 } } arr[i] = x; // 将基准值放入最终位置 quickSort(arr, begin, j - 1); // 前端子序列再排序,递归调用 quickSort(arr, i + 1, end); // 后端子序列在排序,递归调用 } }