最小最大数

第二个算法的时间复杂度为O(n),比较次数为3N/2

#include<iostream>
#include<vector>
#include<ctime>

using namespace std;

void minmax(vector<int> a){//来自编程珠玑
    int min=a[0];
    int max=a[0];
    int n=a.size();
    for(int i=1;i<n;i++){
        if(a[i]<min){
            min = a[i];
        }
        else if(a[i]>max){
            max=a[i];
        }
    }
    cout<<"min,max="<<min<<","<<max<<endl;
}

void minmax2(vector<int> a){//来自算法导论
    int n = a.size();
    int min=a[0];
    int max;
    int k;
    if(n%2!=0){
        max = a[0];
        k=1;
    }
    else{
        max = a[1];
        k=2;
    }
    for(;k<n;k += 2){
        if(a[k]<a[k+1]){
            if(a[k]<min){
                min = a[k];
            }
            if(a[k+1]>max){
                max = a[k+1];
            }
        }
        else{
            if(a[k+1]<min){
                min = a[k+1];
            }
            if(a[k]>max){
                max = a[k];
            }
        }
    }
    cout<<"min,max="<<min<<","<<max<<endl;

}

int main(){
    vector<int> a{12,42,23,3,45,99,21,76};
    clock_t  st,fi,st2,fi2;
    st = clock();
    minmax(a);
    fi = clock();
    cout<<"minmax:"<<(fi-st)<<endl;
    st2 = clock();
    minmax2(a);
    fi2 = clock();
    cout<<"minmax:"<<(fi2-st2)<<endl;
    return 0;
}

时间: 2024-10-20 03:52:40

最小最大数的相关文章

JAVA编程-------------24、将一组数的最大数放在第一位,最小的数放在最后一位

1 package FushiExam; 2 import java.util.*; 3 public class Text_34 { 4 5 public static void main(String[] args) { 6 //输入数组,最大的与第一个元素交换,最小的与最后一个交换 7 Scanner scan=new Scanner(System.in); 8 //设置要输入的数组个数 9 System.out.println("输入你要输入的数组个数:"); 10 int n

定义一个由整数组成的数组,然后输入一个整数X,如果X不在此数组中,返回小于X的最大数的位置i和大于X的最小数的位置j

//定义一个由整数组成的数组,然后输入一个整数x,如果X不在此数组中,返回小于X的最大数的位置i和大于X的最小数的位置j: //若X在此数组中,则返回数组中这个数的位置. 源代码: #include<iostream> using namespace std; void main() { int array[]={1,2,3,4,5,6,7,89,45,32,56,78,12,43,90,19};//16个数字 int x; int max=array[0]; int min=array[0]

实例13_求解二维数组的最大元素和最小元素

实例说明: 看完题,我觉得作者应该就是让我输出一个数组中最大的数字和最小的数字吧,于是开始写了. 1.先给数组赋值 2.然后遍历数组,通过中间值,选出最大的和最小的. 1 /** 2 * Copyright (c) 1991 - 2016 Arvin Tang. 3 * All rights reserved. 4 * 5 * 文件名称:实例13 6 * 简要描述:求解二维数组的最大和最小元素 7 * 8 * 当前版本:1.0 9 * 作 者: 10 * 完成日期:2016-1-7 11 * 修

找出最小的k个数

•已知数组中的n个正数,找出其中最小的k个数. •例如(4.5.1.6.2.7.3.8),k=4,则最小的4个数是1,2,3,4 •要求: –高效: –分析时空效率 •扩展:能否设计出适合在海量数据中实现上述运算? 方法一: 1 //利用最大根堆实现最小k个节点 2 //最大根堆特点:每个节点都比他左右孩子要大 3 //调整最大堆的时间复杂度为O(lnK),因此该算法(问题)时间复杂度为O(nlnK). 4 //思路:通过数组建堆 5 //规律:第i个节点的左孩子为2i+1,右孩子为2i+2 6

洛谷P1198 [JSOI2008]最大数

P1198 [JSOI2008]最大数 267通过 1.2K提交 题目提供者该用户不存在 标签线段树各省省选 难度提高+/省选- 提交该题 讨论 题解 记录 最新讨论 WA80的戳这QwQ BZOJ都过了,洛谷竟然过不了… 为什么过不了 = =我想说这题加优读会WA?… 谁说pascal只能80,要换c++… 线段树为什么是80? 题目描述 现在请求你维护一个数列,要求提供以下两种操作: 1. 查询操作. 语法:Q L 功能:查询当前数列中末尾L个数中的最大的数,并输出这个数的值. 限制:L不超

剑指Offer面试题30(java版):最小的k个数

题目:输入n个整数,找出其中最小的k个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4 这道题最简单的思路莫过于把输入的n个整数排序,排序之后位于最前面的k个数就是最小的k个数.这种思路的时间复杂度是O(nlogn),面试官会提示我们还有更快的算法. 解法一:O(n)的算法,只有当我们可疑修改输入的数组时可用 从上一题中我们可以得到启发,我们同样可以基于Partition函数来解决这个问题.如果基于数组的第k个数字来调整,使得比第k个数字小的所有数字都位于数

同时寻找最大数和最小数的最优算法以及寻找最大的两个数所需的最少比较次数

我们知道,在一个容量为n的数据集合中寻找一个最大数,不管用什么样的比较算法,至少要比较n-1次,就算是用竞标赛排序也得比较n-1次,否则你找到的就不能保证是最大的数.那么,在一个容量为n的数据集合中同时寻找最大数和最小数的最小比较次数是多少呢? 从一个容量为n的数据集合中同时找到最大数和最小数的最优方法是:首先让所有的元素参与两两比较,这样总共比较了n/2次,最大数肯定在胜者组中,最小数肯定在败者组中:然后从容量为n/2的胜者组中找到最大的数,最少要比较n/2 - 1次:同理,从容量为n/2的败

寻找最小的K个数

寻找最小的K个数 题目描述:查找最小的K个数 题目:输入n个整数,输出其中最小的K个数 例如,输入1.2.3.4.5.6.7.8这8个数字,则最小的4个数字为1.2.3.4. 第一节.各种思路,各种选择 要求一个序列中最小的K个数,按照惯有的思维方式,很简单,先对这个序列从小到大排序,然后输出前面的最小的K个数即可: 至于选取什么样的排序方法,第一时间应该想到的是快速排序,我们知道,快速排序平均时间复杂度为O(nlogn),然后再遍历序列中前K个元素输出,即可,总的时间复杂度为O(nlogn +

排序,求几个最值问题,输入n个整数,输出其中最小的k个元素。

看完两个求最大值算法之后的一些感想. 如果想直接看算法的可以跳过.但是我觉得我这些想法还是比较有用的,至少对我将来的算法设计是这样的. 算法的功能越强大,必然意味着速度慢,因为根据丛林法则,那种慢又功能少的算法会被淘汰. 所以,(注意了!!),如果我们在使用一个算法的时候感觉到它造成的结果满足我们的使用,而且超出了,我们的使用,那么我们就很可能浪费了时间,降低了效率. 例如这个1000个数中求最大的10个的算法: 如果排序,取前10个.发现后面的白排序了,根本没用到.参照加粗行,也许可以有更快的