这个问题的解决肯定是要先排序的,然后再定位,区别在于 查找第K大元素 不需要将整个数组全部排序,找到第K大元素即可停下。可以用冒泡沉底法之类的排序方法,本例中使用的是我上一篇文章中介绍的堆排序算法,在这个算法的基础上改动一行代码就可以实现了,即将for(int i = array.length - 1; i >= 2; i--)循环的结束条件修改为for(int i = array.length - 1; i >= array.length - (k + 1); i--)。请看下面代码:
<span style="font-size:14px;">package com.lee.sort;
public class HeapSort {
/**
* 堆排序(Heapsort)是指利用堆这种数据结构所设计的一种排序算法。
* 堆积是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。
* 堆排序的平均时间复杂度为Ο(nlogn) 。
* 算法步骤:
* 1. 创建一个堆H[0..n-1]
* 2. 把堆首(最大值)和堆尾互换
* 3. 把堆的尺寸缩小1,并调用shift_down(0),目的是把新的数组顶端数据调整到相应位置
* 4. 重复步骤2,直到堆的尺寸为1
*
*
*
*注意:本例中元素序号从1开始。。。
* @param args
*/
private static int heap_size = 0; //最大堆的长度
private static int k = 4;
public static void main(String[] args) {
// TODO Auto-generated method stub
int[] array = {0, 8, 20, 15, 11, 50, 30, 90, 77, 33, 56};
System.out.println("排序前..........................");
for(int i = 1; i < array.length; i++){
System.out.print(array[i] + " ");
}
System.out.println();
heap_size = array.length;
heapSort(array);
System.out.println("排序后.........................");
for(int i = 1;

本文介绍了如何在不完全排序的情况下,通过调整堆排序算法来查找无序数组中的第K大元素。通过示例代码展示了一种方法,该方法减少了不必要的排序步骤,当找到第K大元素时即停止操作。最终示例中,数组 [8, 20, 15, 11, 50, 30, 90, 77, 33, 56] 的第3大元素是 33。"
103337969,5053845,思科、华为、H3C网络设备命令对比解析,"['网络设备', '网络配置', '命令行接口', '网络管理员', '认证培训']
最低0.47元/天 解锁文章

被折叠的 条评论
为什么被折叠?



