zoukankan      html  css  js  c++  java
  • 在未排序的数组中找到第 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
    说明:
    
    你可以假设 k 总是有效的,且 1 ≤ k ≤ 数组的长度。
    思路方法:
    这道题思路就挺简单的,考查的就是对排序算法的了解。就用排序算法把数组元素按照降序排列,最后返回排序好的数组中下标为k-1的元素即是答案。
    下面我写了几种方法:
    package xupt.ymm.exercise;
    
    public class K1 {
    	//插入排序
    	public static int findKMax1(int[] nums, int k) {
    		int len = nums.length;
    		for(int i = 1;i < len;i++) { 
    			//遍历整个数组,从下标为1开始,因为第一个数字和自己永远那都是有序的
    			int j = i;
    			int tmp = nums[i] ;//找到未排序的数组的第一个
    			while(j > 0 && tmp > nums[j - 1] ) { //和之前排好的进行比较
    				nums[j] = nums[j - 1]; //大了就交换
    				j--;
    			}
    			nums[j] = tmp; //不打就还是原来的位子
    		}
    		return nums[k - 1]; //返回从大到小排序的第k-1的数就是目标
    	}
    	
    	//选择排序
    	public static int findKMax2(int[] nums,int k) {
    		int len = nums.length;
    		int tmp;
    		for(int i = 0;i < len - 1;i++) { //从零开始遍历
    			int max = i;
    			for(int j = i + 1;j < len;j++) { //未排序遍历
    				if(nums[j] > nums[max]) { //后面的比前面的大
    					max = j; //把大的当最大值
    				}
    			}
    			tmp = nums[i];//前面小的和最大值交换
    			nums[i] = nums[max];
    			nums[max] = tmp;
    		}
    		return nums[k - 1];
    	}
    	//冒泡排序
    	public static int findKMax3(int[] nums,int k) {
    		int len = nums.length;
    		int i = len - 1;
    		while(i > 0) {
    			int count = 0;
    			for(int j = 0;j < i;j++) {
    				if(nums[j + 1] > nums[j]) {
    					int temp = nums[j + 1];
    					nums[j + 1] = nums[j];
    					nums[j] = temp;
    					count = j + 1;
    				}
    			}
    			i = count;
    		}
    		return nums[k - 1];
    	}
    	
    	//冒泡排序
    	public static int findKMax4(int[] nums,int k) {
    		int len = nums.length;
    		for(int i = 0;i < len - 1;i++) {
    			for(int j = i + 1;j < len;j++) {
    				if(nums[j] > nums[i]) {
    					int temp = nums[i];
    					nums[i] = nums[j];
    					nums[j] = temp;
    				}
    		}
    }
    		return nums[k - 1];
    	}
    
          //测试 public static void main(String[] args) { int [] nums = {3,2,1,5,6,4}; int k = 2; findKMax4(nums,k); for(int n = 0;n < nums.length;n++) { System.out.print(nums[n] + " "); } System.out.println("findKMax4 " + findKMax4(nums,k)); findKMax3(nums,k); for(int n = 0;n < nums.length;n++) { System.out.print(nums[n] + " "); } System.out.println("findKMax3 " + findKMax3(nums,k)); findKMax2(nums,k); for(int n = 0;n < nums.length;n++) { System.out.print(nums[n] + " "); } System.out.println("findKMax2 " + findKMax2(nums,k)); findKMax1(nums,k); for(int n = 0;n < nums.length;n++) { System.out.print(nums[n] + " "); } System.out.println("findKMax1 " + findKMax1(nums,k)); } }

    运行结果如下:

     以上就是我对这个题目的解答,用来三种排序,其实也可以有其他的排序都可以。如果有需要,请自行完成,我就不一一列举了。



  • 相关阅读:
    msp430入门编程41
    msp430入门编程40
    msp430入门编程37
    msp430入门编程36
    msp430入门编程35
    msp430入门编程34
    msp430入门编程33
    msp430入门编程31
    msp430入门编程32
    msp430入门编程30
  • 原文地址:https://www.cnblogs.com/youdiaodaxue16/p/10708228.html
Copyright © 2011-2022 走看看