快速排序代码(2021 年暑假写)
2021-08-17 本文已影响0人
李威威
参考代码 1:
public class Solution {
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;
}
// nums[left + 1..j] < pivot
// nums[j + 1..right] >= pivot
int pivot = nums[left];
int j = left;
for (int i = left + 1; i <= right; i++) {
if (nums[i] < pivot) {
j++;
swap(nums, j, i);
}
}
swap(nums, left, j);
quickSort(nums, left, j - 1);
quickSort(nums, j + 1, right);
}
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 static final Random random = new Random();
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;
}
// nums[left + 1..j] < pivot
// nums[j + 1..right] >= pivot
// [0..right - left + 1)
// [left..right + 1) = [left..right]
int randomIndex = left + random.nextInt(right - left + 1);
swap(nums, left, randomIndex);
int pivot = nums[left];
int j = left;
for (int i = left + 1; i <= right; i++) {
if (nums[i] < pivot) {
j++;
swap(nums, j, i);
}
}
swap(nums, left, j);
quickSort(nums, left, j - 1);
quickSort(nums, j + 1, right);
}
private void swap(int[] nums, int index1, int index2) {
int temp = nums[index1];
nums[index1] = nums[index2];
nums[index2] = temp;
}
}
循环不变量修改以后(代码特别别扭)
import java.util.Random;
public class Solution {
private static final Random random = new Random();
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;
}
// nums[left + 1..j) <= pivot
// nums[j..right] > pivot
// [0..right - left + 1)
// [left..right + 1) = [left..right]
int randomIndex = left + random.nextInt(right - left + 1);
swap(nums, left, randomIndex);
int pivot = nums[left];
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);
quickSort(nums, left, j - 2);
quickSort(nums, j, right);
}
private void swap(int[] nums, int index1, int index2) {
int temp = nums[index1];
nums[index1] = nums[index2];
nums[index2] = temp;
}
}
import java.util.Random;
public class Solution {
private static final Random random = new Random();
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];
// 把 pivot 等概率分到两边
// nums[left + 1..le]<= pivot
// nums[ge..right] >= pivot
// 为了看到下一个元素
int le = left + 1;
int ge = right;
while (le <= ge) {
while (le <= ge && nums[le] < pivot) {
le++;
}
while (le <= ge && nums[ge] > pivot) {
ge--;
}
if (le >= ge) {
break;
}
swap(nums, le, ge);
le++;
ge--;
}
swap(nums, left, ge);
quickSort(nums, left, ge - 1);
quickSort(nums, ge + 1, right);
}
private void swap(int[] nums, int index1, int index2) {
int temp = nums[index1];
nums[index1] = nums[index2];
nums[index2] = temp;
}
}
import java.util.Random;
public class Solution {
private static final Random random = new Random();
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];
// 把 pivot 等概率分到两边
// nums[left + 1..lt] < pivot
// nums[lt + 1..i) == pivot
// nums[gt..right] > pivot
// 为了看到下一个元素
int lt = left;
int gt = right + 1;
int i = left + 1;
while (i < gt) {
if (nums[i] < pivot) {
lt++;
swap(nums, i, lt);
i++;
} else if (nums[i] == pivot) {
i++;
} else {
gt--;
swap(nums, i, gt);
}
}
swap(nums, left, lt);
quickSort(nums, left, lt - 1);
quickSort(nums, gt, right);
}
private void swap(int[] nums, int index1, int index2) {
int temp = nums[index1];
nums[index1] = nums[index2];
nums[index2] = temp;
}
}
import java.util.Random;
public class Solution {
private static final Random random = new Random();
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];
// 把 pivot 等概率分到两边
// nums[left + 1..lt) < pivot
// nums[lt..i) == pivot
// nums(gt..right] > pivot
// 为了看到下一个元素
int lt = left + 1;
int gt = right;
int i = left + 1;
while (i <= gt) {
if (nums[i] < pivot) {
swap(nums, i, lt);
lt++;
i++;
} else if (nums[i] == pivot) {
i++;
} else {
swap(nums, i, gt);
gt--;
}
}
swap(nums, left, lt - 1);
quickSort(nums, left, lt - 2);
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;
}
}
还未优化:
public class Solution7 {
// 快速排序
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) {
// 优化 1 :改成插入排序
if (right - left + 1 <= 16) {
insertionSort(nums, left, right);
return;
}
int pivot = nums[left];
// nums[left + 1..j] < pivot
// nums[j + 1..right] >= 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);
quickSort(nums, left, j - 1);
quickSort(nums, j + 1, right);
}
private void swap(int[] nums, int index1, int index2) {
int temp = nums[index1];
nums[index1] = nums[index2];
nums[index2] = temp;
}
private void insertionSort(int[] nums, int left, int right) {
for (int i = left + 1; i <= right; i++) {
int temp = nums[i];
int j;
for (j = i; j > left && nums[j - 1] > temp; j--) {
nums[j] = nums[j - 1];
}
nums[j] = temp;
}
}
}
优化 1:加上随机化
import java.util.Random;
public class Solution {
// 快速排序
private static final Random RANDOM = new Random();
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) {
// 优化 1 :改成插入排序
if (right - left + 1 <= 16) {
insertionSort(nums, left, right);
return;
}
// [0..right - left]
// [left..right]
int randomIndex = left + RANDOM.nextInt(right - left + 1);
swap(nums, left, randomIndex);
int pivot = nums[left];
// nums[left + 1..j] < pivot
// nums[j + 1..right] >= 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);
quickSort(nums, left, j - 1);
quickSort(nums, j + 1, right);
}
private void swap(int[] nums, int index1, int index2) {
int temp = nums[index1];
nums[index1] = nums[index2];
nums[index2] = temp;
}
private void insertionSort(int[] nums, int left, int right) {
for (int i = left + 1; i <= right; i++) {
int temp = nums[i];
int j;
for (j = i; j > left && nums[j - 1] > temp; j--) {
nums[j] = nums[j - 1];
}
nums[j] = temp;
}
}
}
双路快排:
import java.util.Random;
public class Solution {
// 快速排序
private static final Random RANDOM = new Random();
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) {
// 优化 1 :改成插入排序
if (right - left + 1 <= 16) {
insertionSort(nums, left, right);
return;
}
// [0..right - left]
// [left..right]
int randomIndex = left + RANDOM.nextInt(right - left + 1);
swap(nums, left, randomIndex);
int pivot = nums[left];
// nums[left + 1..i] <= pivot
// nums[j..right] >= pivot
int i = left + 1;
int j = right;
while (i <= j) {
while (i <= j && nums[i] < pivot) {
i++;
}
while (i <= j && nums[j] > pivot) {
j--;
}
// 这里很关键
if (i >= j) {
break;
}
swap(nums, i, j);
i++;
j--;
}
swap(nums, left, j);
quickSort(nums, left, j - 1);
quickSort(nums, j + 1, right);
}
private void swap(int[] nums, int index1, int index2) {
int temp = nums[index1];
nums[index1] = nums[index2];
nums[index2] = temp;
}
private void insertionSort(int[] nums, int left, int right) {
for (int i = left + 1; i <= right; i++) {
int temp = nums[i];
int j;
for (j = i; j > left && nums[j - 1] > temp; j--) {
nums[j] = nums[j - 1];
}
nums[j] = temp;
}
}
}
三路快排:
import java.util.Random;
public class Solution {
// 快速排序
private static final Random RANDOM = new Random();
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) {
// 优化 1 :改成插入排序
if (right - left + 1 <= 16) {
insertionSort(nums, left, right);
return;
}
// [0..right - left]
// [left..right]
int randomIndex = left + RANDOM.nextInt(right - left + 1);
swap(nums, left, randomIndex);
int pivot = nums[left];
// nums[left + 1..lt] < pivot
// nums[lt + 1..i) == pivot
// nums[gt..right] >= pivot
int lt = left;
int gt = right + 1;
int i = left + 1;
while (i < gt) {
if (nums[i] < pivot) {
lt++;
swap(nums, lt, i);
i++;
} else if (nums[i] == pivot) {
i++;
} else {
gt--;
swap(nums, i, gt);
}
}
swap(nums, left, lt);
quickSort(nums, left, lt - 1);
quickSort(nums, gt, right);
}
private void swap(int[] nums, int index1, int index2) {
int temp = nums[index1];
nums[index1] = nums[index2];
nums[index2] = temp;
}
private void insertionSort(int[] nums, int left, int right) {
for (int i = left + 1; i <= right; i++) {
int temp = nums[i];
int j;
for (j = i; j > left && nums[j - 1] > temp; j--) {
nums[j] = nums[j - 1];
}
nums[j] = temp;
}
}
}