简述Java实现三色排序(类似快排) ?
参考答案:
三色排序(Three-way Quicksort)是快速排序的一个变种,它在处理有大量重复元素的数组时表现得更好。在标准快速排序中,我们选择一个“主元”(pivot),然后将数组划分为两部分:小于主元的元素和大于主元的元素。但在三色排序中,我们将数组划分为三部分:小于主元的元素、等于主元的元素和大于主元的元素。
以下是使用Java实现三色排序的基本步骤:
-
选择一个主元(pivot)。通常,我们可以选择数组的第一个元素或最后一个元素作为主元。
-
初始化三个指针:
lt
(小于主元的元素),gt
(大于主元的元素),i
(当前正在考虑的元素)。开始时,lt
和gt
都指向数组的起始位置,i
从数组的第二个元素开始。 -
遍历数组,移动
lt
、i
和gt
三个指针:- 如果
arr[i]
小于主元,则交换arr[lt]
和arr[i]
,然后lt
和i
都向右移动一位。 - 如果
arr[i]
大于主元,则交换arr[i]
和arr[gt]
,然后只移动gt
(i
保持不变)。 - 如果
arr[i]
等于主元,则只移动i
。
- 如果
-
遍历结束后,
arr[0..lt-1]
是小于主元的元素,arr[lt..gt]
是等于主元的元素,arr[gt+1..n-1]
是大于主元的元素。 -
对小于主元和大于主元的两个部分递归地应用上述过程。
下面是一个简单的Java实现示例:
public class ThreeWayQuicksort {
public static void quicksort(int[] arr, int lt, int gt) {
if (lt < gt) {
int pivotIndex = partition(arr, lt, gt);
quicksort(arr, lt, pivotIndex - 1);
quicksort(arr, pivotIndex + 1, gt);
}
}
private static int partition(int[] arr, int lt, int gt) {
int pivot = arr[lt];
int i = lt + 1;
int gtIdx = gt;
while (i <= gtIdx) {
if (arr[i] < pivot) {
swap(arr, i++, lt++);
} else if (arr[i] > pivot) {
swap(arr, i, gtIdx--);
} else {
i++;
}
}
swap(arr, lt, gtIdx);
return gtIdx;
}
private static void swap(int[] arr, int i, int j) {
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
public static void main(String[] args) {
int[] arr = {1, 0, 3, 3, 2, 2, 2, 5, 4};
quicksort(arr, 0, arr.length - 1);
System.out.println(Arrays.toString(arr)); // 输出:[0, 1, 2, 2, 2, 3, 3, 4, 5]
}
}
这个实现首先定义了一个quicksort
方法,它接受一个数组和要排序的部分的左右索引。然后,它使用partition
方法将数组划分为三部分,并递归地对小于主元和大于主元的部分进行排序。swap
方法用于交换数组中的两个元素。最后,在main
方法中,我们创建了一个示例数组并调用quicksort
方法进行排序。