参考July的文章:http://blog.csdn.net/v_JULY_v/article/details/6370650

寻找最小的k个数
题目描述:查找最小的k个元素
题目:输入n个整数,输出其中最小的k个。
例如输入1,2,3,4,5,6,7和8这8个数字,则最小的4个数字为1,2,3和4。

总体思路:

取n个数字的前k个数字构建大根堆,设根顶元素为kmax,

从n-k+1开始遍历剩余的n-k个元素,取出每一个元素和大根堆根元素进行比较,如果kmax>遍历到的元素值,则kmax=遍历到的元素值,并更新大根堆。

算法时间复杂度分析:TODO

C++代码:

#include <iostream>
#include <assert.h>
using namespace std;
//调整根元素序号为index的子树
void MaxHeapAdjust(int arr[], int index, int len)
{
int largeIndex = index;
int leftChildIndex = index * ;
if(leftChildIndex <= len && arr[leftChildIndex] > arr[index])
{
largeIndex = leftChildIndex;
}
int rightChildIndex = index * + ;
if(rightChildIndex <= len && arr[rightChildIndex] > arr[index] && arr[leftChildIndex] < arr[rightChildIndex])
{
largeIndex = rightChildIndex;
} if(largeIndex != index)
{
int tmp = arr[index];
arr[index] = arr[largeIndex];
arr[largeIndex] = tmp; MaxHeapAdjust(arr, largeIndex, len);
}
} void MaxHeapBuild(int arr[], int len)
{
for(int i=len/; i>=; i--)
{
MaxHeapAdjust(arr, i, len);
}
} int main()
{
//int a[] = {1, 2, 3, 4, 5, 6, 7, 8};
int a[] = {, , , , , , , };
//从n个元素中查找出最小的k个元素
const int n = ;
const int k = ;
//构建k个元素的大根堆
int maxheap[k+];//因为堆元素的序号从1开始,数组的序号从0开始,这里添加一个无意义的首元素maxheap[0]
for(int i=; i<=k; i++)
{
maxheap[i] = a[i-];
}
MaxHeapBuild(maxheap, k);
cout << "构建k个元素的大根堆" << endl;
for(int i=;i<=k;i++)
cout << maxheap[i] << " ";
cout << endl; //遍历剩下的n-k个元素,与大根堆的根元素进行判断处理
for(int i=n-k; i<n; i++)
{
if(maxheap[] > a[i])
{
maxheap[] = a[i];
MaxHeapAdjust(maxheap, , k);
}
}
cout << "查找出的最小的k个元素为" << endl;
for(int i=; i<=k; i++)
cout << maxheap[i] << " ";
cout << endl; cin.get();
cin.get();
return ;
}

算法练习:寻找最小的k个数的更多相关文章

  1. 算法练习-寻找最小的k个数

    练习问题来源 https://wizardforcel.gitbooks.io/the-art-of-programming-by-july/content/02.01.html 要求 输入n个整数, ...

  2. 03寻找最小的k个数

    题目描述:查找最小的k个元素         题目:输入n个整数,输出其中最小的k个.         例如输入1,2,3,4,5,6,7和8这8个数字,则最小的4个数字为1,2,3和4. 1:最简单 ...

  3. 算法笔记_035:寻找最小的k个数(Java)

    目录 1 问题描述 2 解决方案 2.1 全部排序法 2.2 部分排序法 2.3 用堆代替数组法 2.4线性选择算法   1 问题描述 有n个整数,请找出其中最小的k个数,要求时间复杂度尽可能低. 2 ...

  4. 编程之法:面试和算法心得(寻找最小的k个数)

    内容全部来自编程之法:面试和算法心得一书,实现是自己写的使用的是java 题目描述 输入n个整数,输出其中最小的k个. 分析与解法 解法一 要求一个序列中最小的k个数,按照惯有的思维方式,则是先对这个 ...

  5. Java实现寻找最小的k个数

    1 问题描述 有n个整数,请找出其中最小的k个数,要求时间复杂度尽可能低. 2 解决方案 2.1 全部排序法 先对这n个整数进行快速排序,在依次输出前k个数. package com.liuzhen. ...

  6. 算法题解:最小的K个数(海量数据Top K问题)

    [本文版权归微信公众号"代码艺术"(ID:onblog)所有,若是转载请务必保留本段原创声明,违者必究.若是文章有不足之处,欢迎关注微信公众号私信与我进行交流!] 题目 输入 n ...

  7. 寻找最小的k个数(四种方法)

    1 使用从大到小的优先队列保存最小的K个数,每次取出K个数之后的其余数和堆顶元素比较,如果比堆顶元素小,则将堆顶元素删除,将该元素插入 void topK(int arr[],int n,int k) ...

  8. 寻找最小的k个数

    1. 能想到的最直接的办法,就是对数组进行排序,最好的排序算法的时间复杂性为O(n*logn),这一个方法请参照各种排序算法. 2. 另外申请一个k空间数组,依次更改里面的最大值,每做一次最多要扫描一 ...

  9. 每日一题 - 剑指 Offer 40. 最小的k个数

    题目信息 时间: 2019-06-30 题目链接:Leetcode tag: 快排 难易程度:中等 题目描述: 输入整数数组 arr ,找出其中最小的 k 个数.例如,输入4.5.1.6.2.7.3. ...

随机推荐

  1. CSS3--transform

    transform:向元素应用2D或3D转换,该属性允许我们对属性旋转,缩放,移动,或倾斜. transfrom:none:定义不进行转换 transfrom:matrix(n,n,n,n,n,n); ...

  2. 【Duke-Image】Week_3 Spatial processing

    Chapter_3 Intensity Transsformations and Spatial Filtering 灰度变换与空间滤波 Intensity transformation functi ...

  3. css学习笔记 4

    伪类可以用来指定一个或多个与其相关的选择符的状态,如a:link a:active a:hover a:visited :ie7及以下不支持. 注意:上面与超链接相关的伪类的顺序必须是:LVHA. 伪 ...

  4. tsql语句分析工具 转

    一款好用且免费的语句分析工具 在调优过程中的查询语句优化阶段,分析语句的执行计划是必经之路,一款好的执行计划分析工具确实可以帮助我们事半功倍 一款名为“Plan Explorer“,自己用的挺爽,不私 ...

  5. Code First Migrations 数据迁移小记

    用了codefirst后一个很大的问题就是代码中的属性字段与数据库中表的同步问题,删掉数据库重新生成当然可以解决,不过数据就丢失了(当然通过代码中初始化数据库添加数据也可以解决,初始化的任务可以通过重 ...

  6. HDFS读写数据块--${dfs.data.dir}选择策略

    最近工作需要,看了HDFS读写数据块这部分.不过可能跟网上大部分帖子不一样,本文主要写了${dfs.data.dir}的选择策略,也就是block在DataNode上的放置策略.我主要是从我们工作需要 ...

  7. openssl

    openssl genrsa -des3 -out server.key 1024openssl req -new server.key -out servr.csr seserver-fnamese ...

  8. 简单研究Loader笔记

    2015-11-11 18:25:34 1. Loader是什么? /** * Static library support version of the framework's {@link and ...

  9. 如何理解和熟练运用js中的call及apply?

    改变this指向 要先明白存在call和apply的原因,才能记得牢一点: 在javascript OOP中,我们经常会这样定义: function cat(){ } cat.prototype={ ...

  10. php发送邮件

    <?php header("content-Type: text/html; charset=utf-8"); require("class.phpmailer.p ...