在 Java 中实现排序可以使用内置的排序方法如 Arrays.sort()
,或者自定义排序算法。下面将解释两种常见的排序算法:快速排序(QuickSort)和归并排序(MergeSort),以及它们在 Java 中的实现。
快速排序(QuickSort)
快速排序是一种分治算法,它的基本步骤如下:
- 选择基准值(Pivot):从数组中选择一个元素作为基准值。
- 分区(Partitioning):重新排列数组,使所有比基准值小的元素都在基准的左边,比基准值大的都在右边。这个步骤结束时,基准值就处于其最终位置。
- 递归(Recursion):递归地在基准值的左右两边子数组上重复上述过程。
快速排序的平均时间复杂度为 O(n log n),但其最坏情况下的时间复杂度为 O(n^2),当数组已经有序或接近有序时会触发最坏情况。
Java 实现:
public class QuickSort {
public static void quickSort(int[] arr, int low, int high) {
if (low < high) {
// partitionIndex 是分区操作正好把数组分成两部分的下标
int partitionIndex = partition(arr, low, high);
// 分别递归排序数组的两个部分
quickSort(arr, low, partitionIndex - 1);
quickSort(arr, partitionIndex + 1, high);
}
}
private static int partition(int[] arr, int low, int high) {
// 选取最后一个元素作为基准值
int pivot = arr[high];
int i = (low - 1); // 较小元素的索引
for (int j = low; j < high; j++) {
// 如果当前元素比基准值小,则交换
if (arr[j] < pivot) {
i++;
// 交换 arr[i] 和 arr[j]
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
// 交换基准值到中间
int temp = arr[i + 1];
arr[i + 1] = arr[high];
arr[high] = temp;
return i + 1;
}
}
归并排序(MergeSort)
归并排序也是一个分治算法,它的主要步骤如下:
- 分解(Divide):将数组分成两半,然后对每半进行归并排序。
- 合并(Conquer):将两个已排序的半部分合并成一个有序的整体。
归并排序保证了最好和最坏情况下的时间复杂度都是 O(n log n),这是因为分解和合并操作都遵守 O(log n) 和 O(n) 的时间复杂度。
Java 实现:
public class MergeSort {
public static void mergeSort(int[] arr, int[] temp, int leftStart, int rightEnd) {
if (leftStart >= rightEnd) {
return;
}
int middle = (leftStart + rightEnd) / 2;
mergeSort(arr, temp, leftStart, middle);
mergeSort(arr, temp, middle + 1, rightEnd);
mergeHalves(arr, temp, leftStart, rightEnd);
}
private static void mergeHalves(int[] arr, int[] temp, int leftStart, int rightEnd) {
int leftEnd = (rightEnd + leftStart) / 2;
int rightStart = leftEnd + 1;
int size = rightEnd - leftStart + 1;
int left = leftStart;
int right = rightStart;
int index = leftStart;
while (left <= leftEnd && right <= rightEnd) {
if (arr[left] <= arr[right]) {
temp[index] = arr[left];
left++;
} else {
temp[index] = arr[right];
right++;