四种方法求解:数组中的第K个最大元素

方法一:快排,输入倒数第k个元素;

方法二:维护一个K大小的大根堆;

public class Main {
    public static void main(String[] args) {

        int[] arr = {16, 7, 3, 20, 17, 8};
        int[] heap = new int[3];
        
        for(int i=0; i<3; i++)
        	heap[i] = arr[i];
        
        heapSort(arr, heap, 3);

        System.out.print(heap[0]);
    }

    private static void heapSort(int[] arr, int[] heap, int k) {
        for (int i = (k-1) / 2; i >= 0; i--) {  // 小根堆
        	downHeap(heap, i, k);
        }
        
        for (int i = k; i < arr.length; i++) {

        	if(arr[i] > heap[0]) {
        		heap[0] = arr[i];
                downHeap(heap, 0, k);
        	}
        }
    }

    public static void downHeap(int[] arr, int parent ,int length) {
		
		int  temp = arr[parent];  
		int childIndex = 2 * parent +1;  
		
		while(childIndex < length){  
	
			if(childIndex + 1 < length && arr[childIndex + 1 ] < arr[childIndex]) {
				childIndex++;
			}

			if(temp <= arr[childIndex]) 
				break;
			
			arr[parent] = arr[childIndex];  
			parent = childIndex;
			childIndex = 2 * childIndex + 1;  
		}
		arr[parent] = temp;
	}
}

方法三:桶排序;

方法四:快排剪枝:

class Solution {

    private int Index = 0;
    public int findKthLargest(int[] nums, int k) {

        return nums[MainSort(nums, k, 0, nums.length-1)];
    }

    public int MainSort(int[] nums, int k, int p, int q){  //快排

        int index = QuickSort(nums, p, q);

        if(index+1 == k){
            return index;
        }
        else if(index+1 > k)
            return MainSort(nums, k, p, index-1);
        else
            return MainSort(nums, k, index+1, q);
    }

    public int QuickSort(int[] nums, int p, int q){  //一次快排

        int index = p, flag = q;
        for(int i=p; i<q; i++){

            if(nums[i] > nums[flag]){
                swap(nums, i, index);
                index++;
            }
        }
        swap(nums, index, flag);

        return index;
    }

    public void swap(int[] nums, int a, int b){
        int temp = nums[a];
        nums[a] = nums[b];
        nums[b] = temp;
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值