热释光;保持左右分区顺序的最简单方法是什么?
所以。。。
我正在处理这个hackerrank挑战,但我有麻烦与他们的打印要求的挑战状态。。。
在围绕枢轴元素进行分区时,请保持左分区和右分区中元素的原始顺序。
…我正在尝试编写最简单/最优雅的解决方案(不希望创建新的数组/列表、旋转多个元素等),下面是我的。。。
import java.io.*;
import java.util.*;
public class Solution {
public static void main(String[] args) {
final int n;
final int[] arr;
try(final Scanner scanner = new Scanner(System.in)) {
n = scanner.nextInt();
arr = new int[n];
for(int i = 0; i < n; i++) {
arr[i] = scanner.nextInt();
}
}
quickSort(arr, 0, n - 1);
}
private static void quickSort(final int[] arr, final int start, final int end) {
if(start >= end) return;
final int partitionIndex = partition(arr, start, end);
quickSort(arr, start, partitionIndex - 1);
quickSort(arr, partitionIndex + 1, end);
for(int i = start; i <= end; i++) {
System.out.print(arr[i] + " ");
}
System.out.println();
}
private static int partition(final int[] arr, final int start, final int end) {
final int pivot = arr[start];
int pivotIndex = end + 1;
for(int i = end; i > start; i--) {
if(arr[i] > pivot) {
pivotIndex--;
final int temp = arr[pivotIndex];
arr[pivotIndex] = arr[i];
arr[i] = temp;
}
}
pivotIndex--;
arr[start] = arr[pivotIndex];
arr[pivotIndex] = pivot;
return pivotIndex;
}
}
…我的提交失败,因为我的第一个分区 {1, 3, 2, 5, 8, 7, 9}
而是 {3, 2, 1, 5, 8, 7, 9}
,因此在后续分区上,我的第一个合并是 1 2
而不是 2 3
因为我的算法没有保持左分区的元素有序(即。 1, 3, 2
).
我的算法从头到尾迭代,不包括start元素(pivot)。。。 {5, 8, 1, 3, 7, 9, 2}
->数据透视为5,数据透视索引为7(超出范围) {5, 8, 1, 3, 7, 9, 2}
->2不大于5,跳过 {5, 8, 1, 3, 7, 9, 2}
->9大于5,轴索引为6,交换9和2 {5, 8, 1, 3, 7, 2, 9}
->7大于5,轴索引为5,交换7和2 {5, 8, 1, 3, 2, 7, 9}
->3不大于5,跳过 {5, 8, 1, 3, 2, 7, 9}
->1不大于5,跳过 {5, 8, 1, 3, 2, 7, 9}
->8大于5,轴索引为4,交换8和2 {5, 2, 1, 3, 8, 7, 9}
->数据透视索引是3,交换5和3 {3, 2, 1, 5, 8, 7, 9}
->第一次分区后的最终结果
…我维持了正确分区的顺序(即。 8 7 9
)但不是左派。。。
暂无答案!
目前还没有任何答案,快来回答吧!