如何在N个无序数组元素中,查找第K大元素

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

这个问题的解决肯定是要先排序的,然后再定位,区别在于 查找第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; 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值