使用堆排序仅对所需的前k个进行排序。在交换函数出了点差错,本来打算用位运算加快速度,忽略了nums[i]与nums[j]交换时i==j的情况,导致位运算结果为0.
class Solution {
public static void main(String[] args) {
int[] n = {1};
System.out.println(findKthLargest(n,n.length));
}
public static int findKthLargest(int[] nums, int k) {
int len = nums.length;
for(int m=len/2-1 ; m>=0 ; m--){
sortHeap(nums,m,len);
}
for(int m=len-1 ; m>=len-k ; m--){
swap(nums,0,m);
sortHeap(nums,0,m);
}
return nums[len-k];
}
public static void sortHeap(int[] nums, int start, int len){
int temp = nums[start];
for(int i = 2*start+1 ; i<len ; i=2*i+1){
if((i+1)<len && nums[i+1]>nums[i]){
i++;
}
if(nums[i]>temp){
nums[start]=nums[i];
start=i;
}
else{
break;
}
}
nums[start]=temp;
}
public static void swap(int[] nums,int i,int j){
nums[i] = nums[i]^nums[j];
nums[j] = nums[j]^nums[i];
nums[i] = nums[i]^nums[j];
}
}
将交换函数加上一条
public static void swap(int[] nums,int i,int j){
if(i==j) return;
nums[i] = nums[i]^nums[j];
nums[j] = nums[j]^nums[i];
nums[i] = nums[i]^nums[j];
}
通过。
也可使用快速排序
class Solution {
public int findKthLargest(int[] nums, int k) {
return(quickSortKth(nums,0, nums.length-1, k));
}
private static int quickSortKth(int[] num, int l, int r,int k) {
// TODO Auto-generated method stub
int pos = num[l];
int i = l, j = r;
while(i<j) {
while(i<j && num[j]<pos) {
j--;
}
if(i<j) {
num[i++]=num[j];
}
while(i<j && num[i]>pos) {
i++;
}
if(i<j) {
num[j--]=num[i];
}
}
num[i]=pos;
if(i==k-1) return num[i];
else if(i<k) return quickSortKth(num, i+1, r, k);
else return quickSortKth(num, 0, i-1, k);
}
}