算法练习-寻找最小的k个数
练习问题来源
https://wizardforcel.gitbooks.io/the-art-of-programming-by-july/content/02.01.html
要求
输入n个整数,输出其中最小的k个
解法
- 最直观的思路,先对 n 个数排序,再一次输出 k 个数,用快速排序,时间复杂度为 - O(n*logn)
- 另一种方法,输出的前 k 个最小的数没要求有顺序。可以先取前 k 个数,遍历找到最大的数记 kmax ,再重剩下的 - n - k个数中依次判断是否有- < kmax的数,若有,替换kmax,再重新找 k 个数中最大的记作 kmax ,直至- n - k个数都遍历完。时间复杂度为- O(n*k)
// 输入n个整数,输出其中最小的k个
void FindMin_k(int a[], int n, int k)
{
    int *b, kmax = a[0], maxIndex = 0;
    for (int i = 0; i < k; ++i) // 取 a[] 中的前 k 个数
    {
        b = a;
        ++b;
        if (kmax < a[i])    // 记录下前 k 个数中最大的数 kmax
        {
            kmax = a[i];
            maxIndex = i;
        }
    }
    b = a;
    for (int i = k; i < n; ++i)
    {
        if (kmax > a[i])    // 后 n-k 个数中若有比 kmax 小的, 与 kmax 替换
            *(b + maxIndex) = a[i];
        kmax = *b; maxIndex = 0;
        for (int j = 0; j < k; ++j) // 重新找 k 个数中最大的
        {
            if (kmax < *(b + j))
            {
                kmax = *(b + j);
                maxIndex = j;
            }
        }
    }
    for (int j = 0; j < k; ++j)
        cout << *(b + j) << " ";
    cout << endl;
}
算法练习-寻找最小的k个数的更多相关文章
- 算法练习:寻找最小的k个数
		参考July的文章:http://blog.csdn.net/v_JULY_v/article/details/6370650 寻找最小的k个数题目描述:查找最小的k个元素题目:输入n个整数,输出其中 ... 
- 03寻找最小的k个数
		题目描述:查找最小的k个元素 题目:输入n个整数,输出其中最小的k个. 例如输入1,2,3,4,5,6,7和8这8个数字,则最小的4个数字为1,2,3和4. 1:最简单 ... 
- 算法笔记_035:寻找最小的k个数(Java)
		目录 1 问题描述 2 解决方案 2.1 全部排序法 2.2 部分排序法 2.3 用堆代替数组法 2.4线性选择算法 1 问题描述 有n个整数,请找出其中最小的k个数,要求时间复杂度尽可能低. 2 ... 
- 编程之法:面试和算法心得(寻找最小的k个数)
		内容全部来自编程之法:面试和算法心得一书,实现是自己写的使用的是java 题目描述 输入n个整数,输出其中最小的k个. 分析与解法 解法一 要求一个序列中最小的k个数,按照惯有的思维方式,则是先对这个 ... 
- Java实现寻找最小的k个数
		1 问题描述 有n个整数,请找出其中最小的k个数,要求时间复杂度尽可能低. 2 解决方案 2.1 全部排序法 先对这n个整数进行快速排序,在依次输出前k个数. package com.liuzhen. ... 
- 算法题解:最小的K个数(海量数据Top K问题)
		[本文版权归微信公众号"代码艺术"(ID:onblog)所有,若是转载请务必保留本段原创声明,违者必究.若是文章有不足之处,欢迎关注微信公众号私信与我进行交流!] 题目 输入 n ... 
- 寻找最小的k个数(四种方法)
		1 使用从大到小的优先队列保存最小的K个数,每次取出K个数之后的其余数和堆顶元素比较,如果比堆顶元素小,则将堆顶元素删除,将该元素插入 void topK(int arr[],int n,int k) ... 
- 寻找最小的k个数
		1. 能想到的最直接的办法,就是对数组进行排序,最好的排序算法的时间复杂性为O(n*logn),这一个方法请参照各种排序算法. 2. 另外申请一个k空间数组,依次更改里面的最大值,每做一次最多要扫描一 ... 
- 每日一题 - 剑指 Offer 40. 最小的k个数
		题目信息 时间: 2019-06-30 题目链接:Leetcode tag: 快排 难易程度:中等 题目描述: 输入整数数组 arr ,找出其中最小的 k 个数.例如,输入4.5.1.6.2.7.3. ... 
随机推荐
- winfom实现关闭后一直运行
			using PLog; using System; using System.Collections.Generic; using System.Diagnostics; using System.L ... 
- freemarker 定义公共header
			<#--公共顶部--> <#macro header title="默认文字" keywords="默认文字" description=&qu ... 
- HDU1085 Holding Bin-Laden Captive!
			Description We all know that Bin-Laden is a notorious terrorist, and he has disappeared for a long t ... 
- keepalived企业管理
			实践案例一:更改nginx反向代理只监听vip地址 10.0.0.3/nana.html 可以使用 10.0.0.5/nana.html 不可以使用 10.0.0.6/nana.html 不可以使 ... 
- linux dns高速缓存
			1.安装部署dns yum install bind -y systemctl start named systemctl enable named systemctl stop firew ... 
- python+splinter实现12306网站刷票并自动购票流程
			python+splinter实现12306网站刷票并自动购票流程 通过python+splinter,实现在12306网站刷票并自动购票流程(无法自动识别验证码). 此类程序只是提高了12306网站 ... 
- java——斗地主小游戏之洗牌发牌
			遇到的问题: 1.int和Integer的区别? 1)Integer是int的包装类,int则是java的一种基本数据类型 . 2)Integer变量必须实例化后才能使用,而int变量不需要 . 3) ... 
- 浅谈APP消息推送
			作为移动端APP产品运营最重要的运营手段,消息推送(push)被越来越多的APP厂商所重视,在信息泛滥的移动互联网时代,手机APP应用安装得越来越多,小小的手机屏幕每天收到的消息推送也越来越多,站在用 ... 
- VBS 学习
			VBS其他功能 获取系统用户名 DimWshNetwork Set WshNetwork =CreateObject("WScript.Network") strTaccount ... 
- javascript 例外处理Try{}catch(e){}
			程序开发中,编程人员经常要面对的是如何编写代码来响应错误事件的发生,即例外处理(exception handlers).如果例外处理代码设计得周全,那么最终呈现给用户的就将是一个友好的界面.否则,就会 ... 
