public class SortAlgrithm {
private final Random random = new Random();
public void quickSort(int[] nums) {
quickSort(nums, 0, nums.length - 1);
}
public void quickSort(int[] nums, int left, int right) {
if (left >= right) {
return;
}
int pivot = randomPartition(nums, left, right);
quickSort(nums, left, pivot - 1);
quickSort(nums, pivot + 1, right);
}
private int randomPartition(int[] nums, int left, int right) {
int pivot = left + random.nextInt(right - left + 1);
swap(nums, pivot, right);
return partition(nums, left, right);
}
private int partition(int[] nums, int left, int right) {
int x = nums[right];
int i = left - 1;
for (int j = left; j < right; j++) {
if (nums[j] <= x) {
i++;
swap(nums, i, j);
}
}
swap(nums, i + 1, right);
return i + 1;
}
public void mergeSort(int[] nums) {
mergeSort(nums, 0, nums.length - 1);
}
public void mergeSort(int[] nums, int left, int right) {
if (left >= right) {
return;
}
int mid = left + (right - left) / 2;
mergeSort(nums, left, mid);
mergeSort(nums, mid + 1, right);
merge(nums, left, mid, right);
}
private void merge(int[] nums, int left, int mid, int right) {
int i = left;
int j = mid + 1;
int[] temp = new int[right - left + 1];
for (int k = left; k <= right; k++) {
if (i > mid) {
temp[k - left] = nums[j++];
} else if (j > right) {
temp[k - left] = nums[i++];
} else if (nums[i] < nums[j]) {
temp[k - left] = nums[i++];
} else {
temp[k - left] = nums[j++];
}
}
for (int k = left; k <= right; k++) {
nums[k] = temp[k - left];
}
}
public void heapSort(int[] nums) {
int len = nums.length;
for (int i = len / 2 - 1; i >= 0; i--) {
adjustHeap(nums, i, len);
}
for (int i = len - 1; i > 0; i--) {
swap(nums, 0, i);
adjustHeap(nums, 0, i);
}
}
private void adjustHeap(int[] nums, int i, int length) {
int temp = nums[i];
for (int k = i * 2 + 1; k < length; k = k * 2 + 1) {
if (k + 1 < length && nums[k] < nums[k + 1]) {
k++;
}
if (nums[k] > temp) {
nums[i] = nums[k];
i = k;
} else {
break;
}
}
nums[i] = temp;
}
public void swap(int[] nums, int i, int j) {
int temp = nums[i];
nums[i] = nums[j];
nums[j] = temp;
}
}
快速排序、归并排序和堆排序
最新推荐文章于 2024-07-03 22:45:00 发布