【发布时间】:2014-11-12 17:25:05
【问题描述】:
这是我的代码,它适用于查找 1-7 个最小整数,但 8 和 9。当我在数组中找到 8 个最小整数时,它返回 null。谁能帮我解决问题在哪里?我在这里使用快速排序。 非常感谢!
update:我已经找到问题所在了,就是main函数中的数组。我改成下面的样子后,
int[] arr = {2, 3, 1, 7, 5, 6, 20, 8, 4, 9};
和
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 那将是次优的! :) 选择可以在 O(n) 中完成。
-
@GiovanniBotta 到底怎么样?当然,这可能是一些家庭作业,但为什么要重新发明轮子呢?
-
@fge Quickselect 并不是“重新发明轮子”。它是轮子。