最小的k个数1 堆排序实现

// 使用堆排序实现 其时间复杂度为O(nlgn)
    private static void buildMaxHeap(int[] input, int end)
    {
        // 从非叶子节点开始进行
        for (int i = (end - 1) / 2; i >= 0; i--)
        {
            // 当前节点 cur的字节点位cur*2+1&cur*2+2
            int cur = i;
            // cur的右孩子存在
            while (cur * 2 + 1 < end)
            {
                int bigIndex = cur * 2 + 1;
                int rightOfCur = cur * 2 + 2;
                // 找出孩子节点中的最大值索引
                if (input[bigIndex] < input[rightOfCur])
                {
                    bigIndex++;
                }
                // input[cur]节点与input[bigIndex] 进行比较进
                if (input[cur] < input[bigIndex])
                {
                    int temp = input[cur];
                    input[cur] = input[bigIndex];
                    input[bigIndex] = temp;
                    // 尤其重要
                    cur = bigIndex;
                }
                else
                {
                    break;
                }

}
        }
    }

private static int[] minKOfNums(int[] nums, int k)
    {
        // 特殊值考虑
        if (nums == null || nums.length < k || k <= 0)
        {
            return null;
        }
        // 声明堆
        int[] maxHeap = new int[k];
        // 初始化
        for (int i = 0; i < k; i++)
        {
            maxHeap[i] = nums[i];
        }
        // 建成最大堆
        buildMaxHeap(maxHeap, maxHeap.length - 1);
        // 进行后续的比较
        for (int i = k; i < nums.length; i++)
        {
            if (maxHeap[0] > nums[i])
            {
                maxHeap[0] = nums[i];
                // 重新建maxHeap
                buildMaxHeap(maxHeap, maxHeap.length - 1);
            }
        }
        return maxHeap;
    }

原文地址:https://www.cnblogs.com/qingtianBKY/p/8283168.html

时间: 2024-10-30 00:22:08

最小的k个数1 堆排序实现的相关文章

【剑指offer】 堆排序查找最小的K个数

上一篇 说了些堆的建立及其相关操作,这里看下用堆来解决数据量较大的时候,查找最小的k个数的情况.这里会用到上一篇中的函数. 我们先生存1千万个随机数,写到文件中: import random def randData(): with open('randint.txt', 'w') as fd: for i in range(1, 10000000): fd.write('%d ' %random.randint(1, 100)) if i % 100 == 0: fd.write('\r')

最小的K个数 C++(BFPRT,堆排序)

题目描述 输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,. //堆排序 #include <iostream> #include <algorithm> #include <vector> using namespace std; class Solution { public: void HeapAdjust(vector<int> &a,int s,int n) { int

找到无序数组中最小的k个数

题目:给定一个无序整数数组arr,找到其中最小的k个数 要求:如果数组arr的长度为n,排序之后自然可以得到最小的k个数,此时时间复杂度与排序的时间复杂度相同均为O(NlogN),本题要求实现时间复杂度为O(NLogK). 1.O(NLogK)的方法,即一直维护一个有k个数的最大的大根堆,这个堆是目前选出的k个最小数,在堆里的k个元素中堆顶的元素是最大的一个. 接下来遍历整个数组,遍历的过程中看当前数是否比堆顶元素小.如果是,就把堆顶的元素替换成当前的数,然后从堆顶的位置调整堆,替换后堆的最大元

找到n中最小的k个数

题目:n个数中,求最小的前k个数. 这道题在各个地方都看到过,在国内出现的频率也非常高. 解法: 1. brute force. O(k*n)复杂度: 2. sort.O(k+n*lgn)复杂度: 3. 最大堆.每次替代的是大小为k的最大堆的最大值.O(k+(n-k)lgk)复杂度. 4. 最小堆.和sort类似,只是建堆后只求前k次.O(n+k*lgn)复杂度.在网上看到一个优化,就是pop出第k小的数(堆顶)的时候,最多只需要调整k-1层(不需要调到堆底).所以可以优化到O(n+k^2).当

算法题:求数组中最小的k个数

说明:本文仅供学习交流,转载请标明出处,欢迎转载! 题目:输入n个整数,找出其中最小的k个数. <剑指offer>给出了两种实现算法: 算法1:采用Partition+递归法,该算法可以说是快速排序和二分查找的有机结合.算法的时间复杂度为O(n),缺点在于在修改Partition的过程中会修改原数组的值. 算法2:采用top-k算法.如果要找最小的K个数,我们才用一个含有K个值的大顶堆:如果要找最大的K个数,我们采用小顶堆.该算法的时间复杂度为O(nlogK),是一种比较好的算法,启发于堆排序

求数组中最小的k个数

题目:输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,. package test; import java.util.ArrayList; import java.util.Comparator; import java.util.PriorityQueue; import org.junit.Test; public class GetLeastNumbers_Solution { /** * 基于优先队列,时间复杂度为

九度 1371 最小的K个数

题目描述:输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,. 输入: 每个测试案例包括2行:第一行为2个整数n,k(1<=n,k<=200000),表示数组的长度. 第二行包含n个整数,表示这n个数,数组中的数的范围是[0,1000 000 000]. 输出: 对应每个测试案例,输出最小的k个数,并按从小到大顺序打印. 样例输入: 8 4 4 5 1 6 2 7 3 8 样例输出: 1 2 3 4 此题的不同之处是最后的输

编程算法 - 最小的k个数 代码(C)

最小的k个数 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 输入n个整数, 找出其中的最小k个数. 使用快速排序(Quick Sort)的方法求解, 把索引值(index)指向前k个数. 代码: /* * main.cpp * * Created on: 2014.6.12 * Author: Spike */ /*eclipse cdt, gcc 4.8.1*/ #include <stdio.h> #include <stdl

编程算法 - 最小的k个数 红黑树 代码(C++)

最小的k个数 红黑树 代码(C++) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 输入n个整数, 找出其中的最小k个数. 使用红黑树(multiset), 每次替换最大的值, 依次迭代. 时间复杂度: O(nlogk). 代码: /* * main.cpp * * Created on: 2014年6月29日 * Author: wang */ #include <iostream> #include <vector> #includ