privatevoidsortArray(int[] nums, int left, int right) { if (left >= right) { // 注意此处需要使用大于等于,当上一层 [0, 1] 找到任意一个枢纽后的下一层调用将会出现 left 大于 right 的情况 return; }
privateintpartition(int[] nums, int left, int right) { intpivotIndex= left + ThreadLocalRandom.current().nextInt(right - left + 1); intpivotValue= nums[pivotIndex]; swap(nums, left, pivotIndex);
intindex= left; for (inti= left + 1; i <= right; i++) { if (nums[i] < pivotValue) { swap(nums, i, ++index); // 确保跳出时 index 为小于 pivotValue 的元素 } }
swap(nums, left, index); // 注意此处是将 left 与 index 交换,因为 left 为枢纽元素
return index; // 注意此处返回 index }
privatevoidswap(int[] nums, int i, int j) { inttmp= nums[i]; nums[i] = nums[j]; nums[j] = tmp; } }
privateintpartition(int[] nums, int left, int right) { intrandomIndex= left + ThreadLocalRandom.current().nextInt(right - left + 1); swap(nums, left, randomIndex);
intpivotValue= nums[left]; inti= left, j = right; while (i < j) { while (i < j && nums[j] >= pivotValue) { j--; } while (i < j && nums[i] <= pivotValue) { i++; } swap(nums, i, j); }
swap(nums, left, i); return i; }
privatevoidswap(int[] nums, int i, int j) { inttmp= nums[i]; nums[i] = nums[j]; nums[j] = tmp; } }