保持分区元素顺序的简单快速排序java实现

gt0wga4j  于 2021-06-29  发布在  Java
关注(0)|答案(0)|浏览(252)

热释光;保持左右分区顺序的最简单方法是什么?
所以。。。
我正在处理这个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 )但不是左派。。。

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题