Leetcode:215. 数组中的第K个最大元素(快排)/考察对排序算法的掌握

题目:
在未排序的数组中找到第 k 个最大的元素。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。
示例 1:
输入: [3,2,1,5,6,4] 和 k = 2
输出: 5
示例 2:
输入: [3,2,3,1,2,4,5,5,6] 和 k = 4
输出: 4

考察对排序算法的掌握。
快排

class Solution {
    public int findKthLargest(int[] nums, int k) {
         sort1(nums,0,nums.length-1);
         k=nums.length-k;
        return nums[k];
    }
    private void sort1(int[]num,int left,int right){
    	if(left>=right) return;//
    	int key=num[left];
    	int i=left;
    	int j=right;
    	
    	while(i<j){
    		//while(j)写在前面,并使用>能保证一个while循环后的key所在位置后面的都是比他大的,前面为小于等于他。
    		//找到一个左边的大的数和右边的小的树进行交换;
    		//寻找的时候有三种情况:
    		//因为设定是从右边开始,当倒数第二次交换完毕后。
    		//(1)两者之间只有小的数,没有大的数:此时j找到一个小的数,j=j-1,停止,i想要寻找一个大的数来作为交换,两者中间已经没有大的数了
            // 只有,小于等于KEY值的,故此时i++一直到i=j;故此时把KEY值从左边换到当前位置
    		//(2)两只之间只有大的数,没有小的数:此时j--,欲找到一个小的数,不过找不到
    		//	直到j=i,此时把key值从左端与此交换
    		//(3)此时,两者之间没有数了,j寻找,j--,j=i;
    		while(num[j]>key&& i<j){
    			j--;
    		}
    		while(num[i]<=key&& i<j){     //<=要注意
    			i++;
    		}
    	//分成两段,左边大,右边小
    		if(i<j){
    			int temp;
    			temp=num[i];
    			num[i]=num[j];
    			num[j]=temp;
    		}
    		
    	}
    	//确认分段点后,把左端的值移过来
    	num[left]=num[j];
    	num[j]=key;
    	//其实每次调用就确定了一个数据的位置num[i];
    	sort1(num,left,i-1);
    	sort1(num,i+1,right);
					}
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值