1 使用从大到小的优先队列保存最小的K个数,每次取出K个数之后的其余数和堆顶元素比较,如果比堆顶元素小,则将堆顶元素删除,将该元素插入

void topK(int arr[],int n,int k)
{if(k>n)return;priority_queue<int> q;for(int i=0;i<n;++i){if(q.size()<k)q.push(arr[i]);else{if(arr[i]<q.top()){q.pop();q.push(arr[i]);}}}while(!q.empty()){cout<<q.top()<<' ';q.pop();}cout<<endl;
}

2 使用set的排序功能,以从大到小的顺序排序所有前K个元素,取出其余的元素与第一个元素比较,如果小于第一个元素,则将第一个元素删除,将当前元素插入。

void topK1(int arr[],int n,int k)
{set<int,greater<int> > st;if(k>n)return;for(int i=0;i<n;++i){if(st.size()<k)st.insert(arr[i]);else{auto iter=st.begin();if(*iter>arr[i]){st.erase(iter);st.insert(arr[i]);}}}auto iter=st.begin();while(iter!=st.end()){cout<<*iter++<<' ';}cout<<endl;
}

3 使用partition的方法,每次找出一个数的固定位置index,其中左边的元素都比该元素小,右边的元素都比该元素大。如果index==k-1,则结束循环,找出的index及之前的元素就是k个最小的元素,否则如果index

大于k-1,则需要找的元素在index的左边,否则需要找的元素在index的右边。循环查找直到index==k-1。

int partition(int arr[],int s,int e)
{int priov=arr[e];int i=s-1;int j=s;for(;j<e;++j){if(arr[j]<priov){++i;swap(arr[i],arr[j]);}}++i;swap(arr[i],arr[e]);return i;
}
void topK2(int arr[],int n,int k)
{int index=partition(arr,0,n-1);while(index!=k-1){if(index<k-1)index=partition(arr,index+1,n-1);elseindex=partition(arr,0,index-1);}for(int i=0;i<k;++i)cout<<arr[i]<<' ';cout<<endl;
}

4 利用选择排序的功能,n个元素中找出最小值与第一个元素交换,从n-1个元素中找出次小值与第二个元素交换,直到找到k个元素位置。

void topK3(int arr[],int n,int k)
{for(int i=0;i<k;++i){int min=i;int j=i+1;while(j<n){if(arr[j]<arr[min])min=j;++j;}if(min!=i)swap(arr[min],arr[i]);}for(int i=0;i<k;++i)cout<<arr[i]<<' ';cout<<endl;
}

转载于:https://www.cnblogs.com/wuchanming/p/4462192.html

寻找最小的k个数(四种方法)相关推荐

  1. 程序员编程艺术:第三章、寻找最小的k个数

    程序员编程艺术:第三章.寻找最小的k个数 作者:July. 时间:二零一一年四月二十八日. 致谢:litaoye, strugglever,yansha,luuillu,Sorehead,及狂想曲创作 ...

  2. 海量数据中,寻找最小的k个数。

    维护k个元素的最大堆,即用容量为k的最大堆存储最小的k个数,k1设为大顶堆中最大元素.遍历一次数列,n,每次遍历一个元素x,与堆顶元素比 较,x<kmax,更新堆,否则不更新堆. 1 // 海量 ...

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

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

  4. c语言从4个整数中找最小的数,编程之法:面试和算法心得(寻找最小的k个数)...

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

  5. 寻找数组中最小的k个数(快排和堆排)

    题目描述 输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,. 思路1:利用快排的思想,寻找第k个位置上正确的数,k位置前面的数即 ...

  6. 微软编程题:寻找最小的k个值

    转载自:http://blog.csdn.net/v_JULY_v/article/details/6370650 寻找最小的k个数 题目描述:5.查找最小的k个元素 题目:输入n个整数,输出其中最小 ...

  7. 快速排序——寻找数组第K大数(由浅入深,四种方法对比讲解!)

    寻找数组第K大数是大厂面试中经常考到的一题,有的小机灵鬼直接用sort()进行排序,两行代码解决,这样看似可行,实则掉入了出题人的陷阱.面试官希望看到的是你对算法的理解,而不是函数的调用.下面,我就以 ...

  8. 窥探算法之美妙——寻找数组中最小的K个数python中巧用最大堆

    原文发表在我的博客主页,转载请注明出处 前言 不论是小算法或者大系统,堆一直是某种场景下程序员比较亲睐的数据结构,而在python中,由于数据结构的极其灵活性,list,tuple, dict在很多情 ...

  9. 4种解法 - 最小的k个数

    文章目录 题目 解法一(查找排序) 解法二(排序截取) 解法三(大顶堆) 解法四(快排) 题目 输入整数数组 arr ,找出其中最小的 k 个数.例如,输入4.5.1.6.2.7.3.8这8个数字,则 ...

  10. 46最小的k个数 47寻找第k大

    46 最小的k个数 第一反应排序的话是O(nlogn),暴力是O(NK),看了题解用优先队列,因为优先队列插入元素需要logn,我们只要让堆的大小控制在k,插入一个元素就值需要logk,这样整体的时间 ...

最新文章

  1. java关键字的用法_JAVA常用关键字及其用法简要说明
  2. 2017-2018-1 20155209 实验三 实时系统
  3. android 输入法文本选择功能,Android的文本和输入---创建输入法(一)
  4. php while结束循环吗,php while循环退不出是什么有关问题
  5. C#中的equals()和==
  6. Magento:在head.phtml中获取产品属性 echo a product attribute in magento head.phtml
  7. 【CV竞赛】百度车道线检测,正在报名中,8.9万元奖金
  8. linux中java 里面启动 重启 停止jar 的 shell
  9. java 关闭阻塞线程池_如果优雅地关闭ExecutorService提供的java线程池
  10. 请求头User-Agent作用?
  11. 文字处理(WORD/WP)中,布局与绘制必然分开
  12. python核心编程---读书笔记:第16章 网络编程
  13. 对IO设备的控制方式
  14. 计算机网络基本原理pdf,自考计算机网络基本原理课程学习指引.pdf
  15. 计算机控制键功能,电脑ctrl键的作用大全
  16. 计算机c盘能格式化吗,C盘能格式化吗
  17. 云计算板块-云计算基础介绍
  18. 同期群分析(Cohort Analysis)
  19. Win10 1809美化
  20. 2020年最新手机处理器对比(附手机CPU天梯图)

热门文章

  1. mysql数据库增删改操作不自动提交事务
  2. Linux正确查看内存占用
  3. 使用visualSVN做版本管理
  4. MySQL int类型的显示
  5. 22. Declare data members private
  6. java收_收java的小程序……谢谢
  7. latex 左对齐_LaTeX从入门到提高(3)
  8. linux持续检测进程脚本,用于检测进程的shell脚本代码小结
  9. Java进阶:SSM(Spring、Spring MVC、MyBatis)整合
  10. 实战Node—幼教平台