寻找最小的k个数(四种方法)
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个数(四种方法)相关推荐
- 程序员编程艺术:第三章、寻找最小的k个数
程序员编程艺术:第三章.寻找最小的k个数 作者:July. 时间:二零一一年四月二十八日. 致谢:litaoye, strugglever,yansha,luuillu,Sorehead,及狂想曲创作 ...
- 海量数据中,寻找最小的k个数。
维护k个元素的最大堆,即用容量为k的最大堆存储最小的k个数,k1设为大顶堆中最大元素.遍历一次数列,n,每次遍历一个元素x,与堆顶元素比 较,x<kmax,更新堆,否则不更新堆. 1 // 海量 ...
- Java实现寻找最小的k个数
1 问题描述 有n个整数,请找出其中最小的k个数,要求时间复杂度尽可能低. 2 解决方案 2.1 全部排序法 先对这n个整数进行快速排序,在依次输出前k个数. package com.liuzhen. ...
- c语言从4个整数中找最小的数,编程之法:面试和算法心得(寻找最小的k个数)...
内容全部来自编程之法:面试和算法心得一书,实现是自己写的使用的是java 题目描述 输入n个整数,输出其中最小的k个. 分析与解法 解法一 要求一个序列中最小的k个数,按照惯有的思维方式,则是先对这个 ...
- 寻找数组中最小的k个数(快排和堆排)
题目描述 输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,. 思路1:利用快排的思想,寻找第k个位置上正确的数,k位置前面的数即 ...
- 微软编程题:寻找最小的k个值
转载自:http://blog.csdn.net/v_JULY_v/article/details/6370650 寻找最小的k个数 题目描述:5.查找最小的k个元素 题目:输入n个整数,输出其中最小 ...
- 快速排序——寻找数组第K大数(由浅入深,四种方法对比讲解!)
寻找数组第K大数是大厂面试中经常考到的一题,有的小机灵鬼直接用sort()进行排序,两行代码解决,这样看似可行,实则掉入了出题人的陷阱.面试官希望看到的是你对算法的理解,而不是函数的调用.下面,我就以 ...
- 窥探算法之美妙——寻找数组中最小的K个数python中巧用最大堆
原文发表在我的博客主页,转载请注明出处 前言 不论是小算法或者大系统,堆一直是某种场景下程序员比较亲睐的数据结构,而在python中,由于数据结构的极其灵活性,list,tuple, dict在很多情 ...
- 4种解法 - 最小的k个数
文章目录 题目 解法一(查找排序) 解法二(排序截取) 解法三(大顶堆) 解法四(快排) 题目 输入整数数组 arr ,找出其中最小的 k 个数.例如,输入4.5.1.6.2.7.3.8这8个数字,则 ...
- 46最小的k个数 47寻找第k大
46 最小的k个数 第一反应排序的话是O(nlogn),暴力是O(NK),看了题解用优先队列,因为优先队列插入元素需要logn,我们只要让堆的大小控制在k,插入一个元素就值需要logk,这样整体的时间 ...
最新文章
- java关键字的用法_JAVA常用关键字及其用法简要说明
- 2017-2018-1 20155209 实验三 实时系统
- android 输入法文本选择功能,Android的文本和输入---创建输入法(一)
- php while结束循环吗,php while循环退不出是什么有关问题
- C#中的equals()和==
- Magento:在head.phtml中获取产品属性 echo a product attribute in magento head.phtml
- 【CV竞赛】百度车道线检测,正在报名中,8.9万元奖金
- linux中java 里面启动 重启 停止jar 的 shell
- java 关闭阻塞线程池_如果优雅地关闭ExecutorService提供的java线程池
- 请求头User-Agent作用?
- 文字处理(WORD/WP)中,布局与绘制必然分开
- python核心编程---读书笔记:第16章 网络编程
- 对IO设备的控制方式
- 计算机网络基本原理pdf,自考计算机网络基本原理课程学习指引.pdf
- 计算机控制键功能,电脑ctrl键的作用大全
- 计算机c盘能格式化吗,C盘能格式化吗
- 云计算板块-云计算基础介绍
- 同期群分析(Cohort Analysis)
- Win10 1809美化
- 2020年最新手机处理器对比(附手机CPU天梯图)