在一个数组中找到前k小的整数

3

这是我的代码,它可以找到数组中从第一个到第七个最小的整数,但无法找出第八和第九个。当我在数组中查找第八个最小的整数时,它返回null。有人能帮我找出问题出在哪里吗?我在这里使用了快速排序。

更新:我已经找到问题所在,就是主函数中的数组。当我将其更改为以下形式后,

int[] arr = {2, 3, 1, 7, 5, 6, 20, 8, 4, 9};

and

if(front>=end) return input;

现在它可以工作了!

import java.util.Arrays;
import java.io.*;

class quicksort{
public static void main(String[] args){
    int[] arr = new int[9];
    arr[0] = 7;
    arr[1] = 2;
    arr[2] = 4;
    arr[3] = 8;
    arr[4] = 3;
    arr[5] = 5;
    arr[6] = 1;
    arr[7] = 0;
    arr[8] = 10;

    System.out.println((Arrays.toString(findKSamllest(arr,8))));
}
public static int partition(int[] input, int front, int end){
    int pivot = input[front];
    while(front < end){
        while(input[front]<pivot)
            front++;
        while(input[end]>pivot)
            end--;
        swap(input,front,end);
    }
    return front;
}
public static void swap(int[] input, int s, int l){
    int temp = input[s];
    input[s] = input[l];
    input[l] = temp;
}

public static int[] findK(int[] input, int front, int end, int k){
    if(front>=end) return null;
    int pivot = partition(input,front,end);
    //System.out.println(pivot);
    if(k==pivot){
        return Arrays.copyOfRange(input,0,pivot);
    }
    else {
        if(k<pivot) 
            return findK(input,front,pivot,k); 
        return findK(input,pivot+1,end,k);
    }
}
public static int[] findKSamllest(int[] input, int k){
    return findK(input, 0, input.length-1, k);
}

}


为什么不使用 Arrays.sort() 然后提取前7个项目呢? - fge
我敢打赌,你可以在一个更小的测试用例上让它失败。 - David Eisenstat
@fge 这样做会不太优化! :) Select 可以在 O(n) 时间内完成。 - Giovanni Botta
@GiovanniBotta 怎么做呢?当然,这可能是一些家庭作业练习,但为什么要重新发明轮子呢? - fge
1
@fge Quickselect并不是“重复造轮子”。它就是轮子。 - Sneftel
显示剩余2条评论
3个回答

3

更改

if(front >= end) return null;

to

if(front > end) return null;

2

站在巨人的肩膀上,使用已经可用的库:

Arrays.sort(myArray);
int[] returnArray = new int(NUM_ITEMS_TO_RETURN);
for (int i=0; i < NUM_ITEMS_TO_RETURN; i++)
{
   returnArray[i] = myArray[i];
}

return returnArray;

显然,您需要进行一些错误检查,例如初始数组是否大于或等于要返回的项目数,但这很简单。

2

使用新的Java 8 API,您可以节省时间并给您的老师留下深刻印象。

它提供了流和有用的函数来解决这个问题,只需一行代码(长一点)或五行(如果可读性更好)。

final List<Integer> sortedKList = Arrays.asList(7, 2, 4, 8, 3, 5, 1, 0, 10)
    .stream()
    .sorted()
    .limit(7)
    .collect(Collectors.toList());

您可以使用以下方式查看结果:
sortedKList.forEach(System.out::println);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接