Java 如何在QuickSelect中实现重复

Java 如何在QuickSelect中实现重复,java,algorithm,big-o,quickselect,Java,Algorithm,Big O,Quickselect,我已经做了快速选择算法,这是找到数组中第k个最小的数。我的问题是,它只适用于没有重复项的数组。 如果我有一个数组 arr={1,2,2,3,5,5,8,2,4,8,8} 它会说第三个最小的数字是2,但实际上是3 我一直在想该怎么做,下面是我的两种方法quickSelect和Partition: private int quickselect(int[] array, int leftIndex, int rightIndex, int kthSmallest) { if(kthSmal

我已经做了快速选择算法,这是找到数组中第k个最小的数。我的问题是,它只适用于没有重复项的数组。 如果我有一个数组

arr={1,2,2,3,5,5,8,2,4,8,8}

它会说第三个最小的数字是2,但实际上是3

我一直在想该怎么做,下面是我的两种方法quickSelect和Partition:

private int quickselect(int[] array, int leftIndex, int rightIndex, int kthSmallest) {

    if(kthSmallest > array.length - 1){
        System.out.print("Number does not exist. Please enter a number less than: ");
        return array.length - 1;
    }

    if (leftIndex == rightIndex) {
        return array[leftIndex];
    }

    int indexOfPivot = generatePivot(leftIndex, rightIndex);

    indexOfPivot = quickSelectPartition(array, leftIndex, rightIndex, indexOfPivot);

    if (kthSmallest == indexOfPivot) {

        return array[kthSmallest];

    } else if (kthSmallest < indexOfPivot) {

        return quickselect(array, leftIndex, indexOfPivot - 1, kthSmallest);

    } else {

        return quickselect(array, indexOfPivot + 1, rightIndex, kthSmallest);
    }
}


private int quickSelectPartition(int[] array, int left, int right, int pivotIndex) {

    int pivotValue = array[pivotIndex];

    swapIndexes(array, pivotIndex, right);

    int firstPointer = left;

    for(int secondPointer = left; secondPointer < right; secondPointer++) {

        if(array[secondPointer] < pivotValue) {

            swapIndexes(array, firstPointer, secondPointer);

            firstPointer++;
        }
    }

    swapIndexes(array, right, firstPointer);

    return firstPointer;
}
private int-quickselect(int[]数组、int-leftIndex、int-righindex、int-kthsmalest){
if(kthSmallest>array.length-1){
System.out.print(“数字不存在,请输入一个小于:”)的数字;
返回数组长度-1;
}
如果(leftIndex==rightIndex){
返回数组[leftIndex];
}
int indexOfPivot=generatePivot(leftIndex,rightIndex);
indexOfPivot=quickSelectPartition(数组、leftIndex、rightIndex、indexOfPivot);
if(kthSmallest==indexOfPivot){
返回数组[kthSmallest];
}否则如果(kthSmallest
如果可以添加到运行时间中,可以从将不同的元素复制到新数组开始:

private int[] getDistinct(int[] array) {
    Set<Integer> distinct = new HashSet<>();
    int endIdx = 0;

    for (int element : array) {

        if (distinct.add(element)) {
            array[endIdx++] = element;
        }
    }

    return Arrays.copyOfRange(array, 0, endIdx);
}
输出:

8

我认为这在
O(n)
最好的情况下是不可能的。您可以使用哈希表,但这只会给您预期的时间。QuickSelect的运行时间是最佳情况和平均情况O(n),所以添加2N仍然是O(n)我想?
8