参考代码 1:
public class Solution {
public int[] sortArray(int[] nums) {
int len = nums.length;
quickSort(nums, 0, len - 1);
return nums;
}
/**
* 对区间 nums[left..right] 执行快速排序
*
* @param nums
* @param left
* @param right
*/
private void quickSort(int[] nums, int left, int right) {
if (left >= right) {
return;
}
int pivotIndex = partition(nums, left, right);
quickSort(nums, left, pivotIndex - 1);
quickSort(nums, pivotIndex + 1, right);
}
private int partition(int[] nums, int left, int right) {
int pivot = nums[left];
// all in nums[left + 1..j] <= pivot
// all in nums(j..i) > pivot
int j = left;
for (int i = left + 1; i <= right; i++) {
if (nums[i] <= pivot) {
j++;
swap(nums, i, j);
}
}
swap(nums, left, j);
return j;
}
private void swap(int[] nums, int index1, int index2) {
int temp = nums[index1];
nums[index1] = nums[index2];
nums[index2] = temp;
}
}
或者:
public class Solution {
public int[] sortArray(int[] nums) {
int len = nums.length;
quickSort(nums, 0, len - 1);
return nums;
}
/**
* 对区间 nums[left..right] 执行排序
*
* @param nums
* @param left
* @param right
*/
private void quickSort(int[] nums, int left, int right) {
if (left >= right) {
return;
}
int pivotIdex = partition(nums, left, right);
quickSort(nums, left, pivotIdex - 1);
quickSort(nums, pivotIdex + 1, right);
}
private int partition(int[] nums, int left, int right) {
int pivot = nums[left];
// all in nums[left + 1..j) <= pivot;
// all in nums[j..i) > pivot;
int j = left + 1;
for (int i = left + 1; i <= right; i++) {
if (nums[i] <= pivot) {
swap(nums, j, i);
j++;
}
}
swap(nums, left, j - 1);
return j - 1;
}
private void swap(int[] nums, int index1, int index2) {
int temp = nums[index1];
nums[index1] = nums[index2];
nums[index2] = temp;
}
}
参考代码 2:
import java.util.Random;
public class Solution {
private final static Random random = new Random(System.currentTimeMillis());
public int[] sortArray(int[] nums) {
int len = nums.length;
quickSort(nums, 0, len - 1);
return nums;
}
/**
* 对区间 nums[left..right] 执行快速排序
*
* @param nums
* @param left
* @param right
*/
private void quickSort(int[] nums, int left, int right) {
if (left >= right) {
return;
}
int pivotIndex = partition(nums, left, right);
quickSort(nums, left, pivotIndex - 1);
quickSort(nums, pivotIndex + 1, right);
}
private int partition(int[] nums, int left, int right) {
// random.nextInt(right - left); [0..right - left]
// left + random.nextInt(right - left); [left..right]
int randomIndex = left + random.nextInt(right - left + 1);
swap(nums, left, randomIndex);
int pivot = nums[left];
// all in nums[left + 1..j] <= pivot
// all in nums(j..i) > pivot
int j = left;
for (int i = left + 1; i <= right; i++) {
if (nums[i] <= pivot) {
j++;
swap(nums, i, j);
}
}
swap(nums, left, j);
return j;
}
private void swap(int[] nums, int index1, int index2) {
int temp = nums[index1];
nums[index1] = nums[index2];
nums[index2] = temp;
}
}
参考代码 3:
import java.util.Random;
public class Solution {
private final static Random random = new Random(System.currentTimeMillis());
public int[] sortArray(int[] nums) {
int len = nums.length;
quickSort(nums, 0, len - 1);
return nums;
}
/**
* 对区间 nums[left..right] 执行快速排序
*
* @param nums
* @param left
* @param right
*/
private void quickSort(int[] nums, int left, int right) {
if (left >= right) {
return;
}
int pivotIndex = partition(nums, left, right);
quickSort(nums, left, pivotIndex - 1);
quickSort(nums, pivotIndex + 1, right);
}
private int partition(int[] nums, int left, int right) {
// random.nextInt(right - left); [0..right - left]
// left + random.nextInt(right - left); [left..right]
int randomIndex = left + random.nextInt(right - left + 1);
swap(nums, left, randomIndex);
int pivot = nums[left];
// all in nums[left + 1..le) <= pivot
// all in nums(ge..right] >= pivot
int le = left + 1;
int ge = right;
while (true) {
while (le <= ge && nums[le] < pivot) {
le++;
}
while (le <= ge && nums[ge] > pivot) {
ge--;
}
// le 来到了第一个大于等于 pivot 的位置
// ge 来到了第一个小于等于 pivot 的位置
if (le >= ge) {
break;
}
swap(nums, le, ge);
le++;
ge--;
}
swap(nums, left, ge);
return ge;
}
private void swap(int[] nums, int index1, int index2) {
int temp = nums[index1];
nums[index1] = nums[index2];
nums[index2] = temp;
}
}
参考代码 4:
import java.util.Random;
public class Solution {
private final static Random random = new Random(System.currentTimeMillis());
public int[] sortArray(int[] nums) {
int len = nums.length;
quickSort(nums, 0, len - 1);
return nums;
}
/**
* 对区间 nums[left..right] 执行快速排序
*
* @param nums
* @param left
* @param right
*/
private void quickSort(int[] nums, int left, int right) {
if (left >= right) {
return;
}
// random.nextInt(right - left); [0..right - left]
// left + random.nextInt(right - left); [left..right]
int randomIndex = left + random.nextInt(right - left + 1);
swap(nums, left, randomIndex);
int pivot = nums[left];
// all in nums[left + 1..lt] < pivot
// all in nums(lt..i) == pivot
// all in nums(gt..right] > pivot
int lt = left;
int gt = right;
int i = left + 1;
while (i <= gt) {
if (nums[i] < pivot) {
lt++;
swap(nums, i, lt);
i++;
} else if (nums[i] == pivot) {
i++;
} else {
// nums[i] > pivot
swap(nums, i, gt);
gt--;
}
}
swap(nums, left, lt);
quickSort(nums, left, lt - 1);
quickSort(nums, gt + 1, right);
}
private void swap(int[] nums, int index1, int index2) {
int temp = nums[index1];
nums[index1] = nums[index2];
nums[index2] = temp;
}
}
参考代码 5:
import java.util.Random;
class Solution {
private final static Random random = new Random(System.currentTimeMillis());
public int[] sortArray(int[] nums) {
int len = nums.length;
quickSort(nums, 0 , len - 1);
return nums;
}
private void quickSort(int[] nums, int left, int right) {
if (left >= right) {
return;
}
int randomIndex = left + random.nextInt(right - left + 1);
swap(nums, left, randomIndex);
int pivot = nums[left];
// all in nums[left + 1..lt) < pivot
// all in nums[lt..i) = pivot
// all in nums[ge..right] > pivot
// lt: less than
int lt = left + 1;
int ge = right + 1;
int i = left + 1;
while (i < ge) {
if (nums[i] < pivot) {
swap(nums, i, lt);
lt++;
i++;
} else if (nums[i] == pivot) {
i++;
} else {
// nums[i] > pivot
ge--;
swap(nums, ge, i);
}
}
swap(nums, left, lt - 1);
quickSort(nums, left, lt - 2);
quickSort(nums, ge, right);
}
private void swap(int[] nums, int index1, int index2) {
int temp = nums[index1];
nums[index1] = nums[index2];
nums[index2] = temp;
}
}