c++(挑选最大的n个数)
从一堆数据中挑选n个最大的数,这个问题是网上流传的比较广的几个问题之一。具体来说,它的意思就是:假设我们有100个数据,我们需要挑选出最大的n个数据(n < 100),那么有没有办法实现这样一个目标呢?在这里,我想从排序的角度看看有没有什么办法可以实现这样一个目标。
在前面的博客当中,我们实现的排序算法有下面几种:
(2) 快速排序
(3) 合并排序
(4) 堆排序
(5)选择排序
(6) 基数排序
那么是不是这8种算法都适合今天的题目呢?我简单的对它们进行了分析和归类:
a)不到最后无法求出最大数据的算法,(插入算法,合并算法,基数排序)
这些算法的特点就是可以保证局部的数据基本有序,但是无法保证全局的数据有序。在全部数据得到正确地排序之前,没有人知道最大的数据是什么。所以针对这个题目而言,要想知道最大的n个数,那就等于要对所有的数据全部排序一遍。
b)每次求出一个最大的数据,依次类推,直到所有的数据都已经排序。(冒泡排序、希尔排序、选择排序、堆排序)
这些算法的特点就是,排序的时候,所有的数据都是按照从大到小排列出来的。按照冒泡排序来说,首先我们选出最大的数据,然后是第二大的数据,依次类推,直到第n大的数据找到为止。堆排序也是这样,我们在构建堆之后,也是每次从堆顶获得一个数据,不断调整堆,再接着获得第二大、第三大......第n大的数据的。我们以冒泡排序为例,看看这一次的算法应该怎么写?
void find_n_max_number(int array[], int length, int number)
{
int inner ;
int outer;
int median; if(NULL == array || 0 == length)
return; if(number > length)
return; for(outer = length -1; outer > (length - 1 - number); outer --){
for(inner = 0; inner < outer; inner ++){
if(array[inner] > array[inner +1]){
median = array[inner];
array[inner] = array[inner + 1];
array[inner + 1]= median;
}
}
}
}
c)迭代搜索,首先对数据进行分类,小于于数组第一个数据的排在左边,大于的排在右边。如果右边的数据小于n,为m,那么在左边数组继续寻找剩下的(n-m)个数据;如果右边的数据大于n,那么在右边的数据继续寻找。(快速排序)
不知道上面的解释说明白了没,没有清楚的同学可以看一看下面这个代码。
int partion(int array[], int start, int end, int swap[])
{
int loop;
int left = 0;
int right = end - start;
int value = array[start]; for(loop = start +1; loop <= end; loop++){
if(array[loop] < value)
swap[left ++] = array[loop];
else
swap[right --] = array[loop];
}
swap[left] = value;
memmove(&array[start], swap, sizeof(int) * (end - start +1));
return left + start;
} void _quick_sort(int array[], int start, int end, int swap[], int number)
{
int middle; if(start < end){
middle = partion(array, start, end, swap); if((number - 1) > (end - middle))
_quick_sort(array, start, middle -1, swap, number - (end - middle + 1));
else
_quick_sort(array, middle + 1, end, swap, number);
}
} void find_n_max_number(int array[], int length, int number)
{
int* swap ;
if(NULL == array || 0 == length)
return; swap = (int*)malloc(sizeof(int) * length);
_quick_sort(array, 0, length-1, swap, number);
free(swap);
}
总结:
至于这些算法的结果怎么样,各位朋友们可以自己利用自己的电脑好好测试一下。
c++(挑选最大的n个数)的更多相关文章
- 一步一步写算法(之挑选最大的n个数)
原文:一步一步写算法(之挑选最大的n个数) [ 声明:版权所有,欢迎转载,请勿用于商业用途. 联系信箱:feixiaoxing @163.com] 从一堆数据中挑选n个最大的数,这个问题是网上流传的 ...
- 华为OJ:素数对个数
素数对个数 题目描述若两个正整数的和为素数,则这两个正整数称之为“素数伴侣”,如2和5.6和13,它们能应用于通信加密.现在密码学会请你设计一个程序,从已有的N(N为偶数)个正整数中挑选出若干对组成“ ...
- 《Algorithms Unlocked》读书笔记2——二分查找和排序算法
<Algorithms Unlocked>是 <算法导论>的合著者之一 Thomas H. Cormen 写的一本算法基础,算是啃CLRS前的开胃菜和辅助教材.如果CLRS的厚 ...
- C语言字符串追加,双色球等案例
//C语言中没有字符串概念,有的只是字符型数组,以str1[]的值为例,该字符数组的长度为11--->包含了字母,空格,以及结束字符'\0'(斜杠0)//基于上述原因,读取一个字符型数组的有效方 ...
- 每年六一儿童节,牛客都会准备一些小礼物去看望孤儿院的小朋友,今年亦是如此。HF作为牛客的资深元老,自然也准备了一些小游戏。其中,有个游戏是这样的:首先,让小朋友们围成一个大圈。然后,他随机指定一个数m,让编号为0的小朋友开始报数。每次喊到m-1的那个小朋友要出列唱首歌,然后可以在礼品箱中任意的挑选礼物,并且不再回到圈中,从他的下一个小朋友开始,继续0...m-1报数....这样下去....直到剩下
// test20.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include<iostream> #include< ...
- 从数组中选出和等于固定值的n个数(JavaScript实现)
现实生活中的问题,可能会抽象为这样一种数据模型: 从一个数组中挑选出几个数,让这几个数相加的和为指定的值. 大多数读者应该有过网购的经历,网购一般会有个凑单功能,假如读者买了70元的商品,但是必须满1 ...
- 挑选队友 (生成函数 + FFT + 分治)
链接:https://www.nowcoder.com/acm/contest/133/D来源:牛客网 题目描述 Applese打开了m个QQ群,向群友们发出了组队的邀请.作为网红选手,Applese ...
- 从n个数里面选择m个数
从n个数里面选择m个数 #include<iostream> #include<vector> using namespace std; vector<int> s ...
- 【Excel】SUMIF 或用 筛选器 实现挑选含有某些字段的值,然后把这些值所对应的后面某列上的值相加
Background: 挑选含有某些字段的值,然后把这些值所对应的后面某列上的值相加.比如挑选下表中,所有带有“MX104”这个字段的值,然后把它的后面total那一列的值相加. Solution: ...
随机推荐
- 来腾讯云开发者实验室 学习.NET
腾讯云开发者实验室为开发者提供了一个零门槛的在线实验平台,开发者实验室提供的能力: 零门槛扫码即可免费领取实验机器,支持使用自有机器参与,实验完成后支持保留实验成果: 在线 WEB IDE 支持 sh ...
- HttpClient4.5 post请求xml到服务器
1.加入HttpClient4.5和junit依赖包 <dependencies> <dependency> <groupId>org.apache.httpcom ...
- lua 实现tableToString
function tableToString(studentNum) local str = "{ " str = str.."\n" for k, v in ...
- 【二十七】php之绘图技术(gd、jpgraph、短信随机验证码)
1.绘图技术(GD库) 注意:使用该库,php.ini文件中的extension=php_gd2.dll必须是开启状态,不然无法使用 图片格式:目前网站开发常见的图片格式有gif,jpg/jpeg,p ...
- Fiddler 抓包https配置 提示creation of the root certificate was not successful 证书安装不成功
在使用Fiddler抓包时,我们有时需要抓https协议的包,这种需要配置一下 开启监控https才可以 首先 找到Tools——>Options 在弹出的菜单中 选择https项 勾选捕捉h ...
- 如何实现虚拟机(VirtualBox)中的Ubuntu与Windows XP间的数据共享
环境: 主机是Windows XP系统 虚拟机与Ubuntu的版本分别为: VirtualBox-3.2.12-68302-Win ubuntu-10.10-desktop-i386 前提:已安装Vi ...
- [Micropython]TPYBoardV102 Dfu固件烧写教程
TPYBoardv10x固件烧写一直是大家比较关心的问题,上次教大家用SWD接口烧写TPYBoard的固件,这次教大家用另一种方式烧写我们TPYBoardv10x的固件,直接用dfu模式烧写固件. 用 ...
- Qt用Zip压缩文件夹的一些坑
环境: QT3.3.8 vs2005 QDir dir("/home/Blinux/html"); if ( !dir.exists() ) { //目录不存在 } QString ...
- PHP读取excel中地址实现多文件下载
PHP文件下载有单文件和多文件之分,如果是单文件写个方法可以实现,但是如果想循环下载多个文件我试验是没有成功.先说单文件的下载,方法如下: function downfile($fileurl) { ...
- 自己写的驱动用CreateFile打开时错误码返回1的问题
就像题目上说的,今天在写一个例子代码时遇到了这个问题,下面是当时驱动层和应用层的代码: #include <ntddk.h> #define BASE_CODE 0x800 #define ...