数组中第K大数字

225 阅读1分钟

算法中有一道经典的题是求出数组中第K大的数字。 解决这道题可以用快速排序的思想。 下面算法的时间复杂度是O(nlong), 空间复杂度O(n)。

public KthSmallest{
    // 数组中第K大数字
    public static int KthSmallest(int data[], int k){
        if(data == null || data.length < k) return -1;
        
        int partition = partition(data, 0, data.length-1);
        while(partition + 1 != k){
            if(partition + 1 < k){
                partition = partition(data, partition+1, data.length-1);
            }else{
                partition = partition(data, 0, partition-1);
            }
        }
        return data[partition];
    }
    
    public static int partition(int[] data, int p, int r){
        int pivot = data[r];
        int i = p;
        
        for(int j=p; j<r; j++){
            // 这里要是 <= ,不然会出现死循环,比如查找数组 [1,1,2] 的第二小的元素
            if(data[j] <= pivot){
                swap(data,i,j);
                i++;
            }
        }
        swap(data,i,r);
        
        return i;
    }
    
    public static void swap(int[] data, int left, int right){
        if(left == right) return ;
        
        int tmp = data[left];
        data[left] = data[right];
        data[right] = tmp;
    }
}