快速排序图解: 思路: 以数组的中轴数为基准数mid。左指针left从第一个元素开始,右指针right从最后一个元素开始。若左指针left元素大于中轴数mid,右指针right元素小于中轴数,则将左右两边元素交换。小于中轴数的元素在左边,大于中轴数的元素在右边。根据以上的步骤分别向左、向右递归。 执行步骤: 指定中轴数为基准数,左边从第一位开始遍历,右边从倒数最后一位开始遍历。若左下标小于右下标,循环遍历。左元素小于中轴数,左下标+1,进入循环;右元素小于中轴数,右下标-1。判断左下标是否大于右下标。将左右元素互换。左元素等于中轴数,右下标-1;右元素等于中轴数,左下标+1。若左右下标相等,将其错位移开。向左递归,向右递归。 import java.util.*; public class QuickSort { public static void main(String[] args) { int[] arr = {5,6,3,7,9,0,4,3,5}; f(arr, 0, arr.length - 1); System.out.println(Arrays.toString(arr)); } public static void f(int[] arr, int left, int right) { // 1.保存最左边元素 int l = left; // 保存最右边元素 int r = right; // 算出中轴数 int pivot = arr[(left + right) / 2]; int temp; // 2.若左边小于右边,循环交换中轴两边的数 while (l < r) { // 3.如果左边元素小于中轴元素,将左元素下标+1 while (arr[l] < pivot) l++; // 若右边元素大于中轴元素,将右边元素下标-1 while (pivot < arr[r]) r--; // 4.判断左下标是否大于等于右下标,若大于等于则break,退出循环 if (l >= r) break; // 5.经过两个while循环后,左边的值大于中轴数,右边的值小于中轴数,将左右的元素交换 temp = arr[l]; arr[l] = arr[r]; arr[r] = temp; // 6.交换后判断左边元素是否与中轴相等,若左边相等,将右下标往左移 if (arr[l] == pivot) r--; // 交换后判断右边元素是否与中轴相等,若右边相等,将做下标往右移 if (arr[r] == pivot) l++; } // 7.若左边下标和右边下标相等,将其错位移开,防止栈溢出 if (l == r) l++; r--; // 8.向左边递归,右边元素改变 if (left < r) quick(arr, left, r); // 向右边递归,左边元素改变 if (l < right) quick(arr, l, right); } }