1. public static void quickSort(int[] arr,int left,int right) {
    2. int l = left;//左下标
    3. int r = right;//右下标
    4. //pivot 中轴值
    5. int pivot = arr[(left + right) / 2];
    6. int temp;//临时变量,交换时使用
    7. //while循环的目的是让比pivot值小的方到左边
    8. //比pivot值大的方到右边
    9. while (l < r) {
    10. //在pivot的左边一直找,找到大于等于pivot值,才退出
    11. while (arr[l] < pivot) {
    12. l += 1;//1-2
    13. }
    14. //在pivot的右边一直找,找到小于等于pivot值,才退出
    15. while (arr[r] > pivot) {
    16. r -= 1;//4-2
    17. }
    18. //如果l >= r说明pivot的左右两边的值已经按照左边都是小于等于pivot值,
    19. //右边都是大于等于pivot的值
    20. if (l >= r) {
    21. break;
    22. }
    23. //交换
    24. temp = arr[l];
    25. arr[l] = arr[r];
    26. arr[r] = temp;
    27. //如果交换完后,发现这个arr[l] == pivot值, r--,前移
    28. if (arr[l] == pivot){
    29. r -= 1;
    30. }
    31. //如果交换完后,发现这个arr[r] == pivot值, l++,前移
    32. if (arr[r] == pivot){
    33. l += 1;
    34. }
    35. }
    36. //如果 l == r,必须l++,r--,否则会出现栈溢出
    37. if (l == r) {
    38. l++;
    39. r--;
    40. }
    41. //向左递归
    42. if (left < r){
    43. quickSort(arr,left,r);
    44. }
    45. //向右递归
    46. if (right > l){
    47. quickSort(arr,l,right);
    48. }
    49. }