精华内容
下载资源
问答
  • 寻找最小值次小值
    2018-12-19 12:09:56

     

    设计一个最优算法来同时找到n元素数组中的最大值和最小值,要求使用最小的比较次数:

    算法导论(3th Edition)9.1:

    https://blog.csdn.net/shuiziliu1025/article/details/50958190

    1.5N即可

     

    应用:选择排序中,可以一下从剩下元素中选出Min Max,放在已经排好序的数组的首尾(虽然真正投入应用都是随机选择排序)

    PS:对于已经基本有序的数据(如文件等等),一定不要使用快速排序,就算随机快排也不要使用(因为最多只能达到平均性能o(nlogn)),使用传统的插入排序是最好的,性能接近O(n)。

     

     

    更多相关内容
  • 如何找数组中的最小值次小值

    千次阅读 2021-04-22 18:57:45
    怎么找数组中的最小值次小值随机产生10个整数放入一维数组,找出其中的最小值次小值输出,并把它们的位置调换#include#include#includeintmain(){intn,i;intmin1,min2;#definemaxsize10intdata[maxsize];srand(...

    怎么找数组中的最小值和次小值

    随机产生10个整数放入一维数组,找出其中的最小值和次小值输出,并把它们的位置调换

    #include

    #include

    #include

    int main()

    {

    int n,i;

    int min1,min2;

    #define maxsize 10

    int data[maxsize];

    srand((unsigned)time(NULL));

    printf("产生10个随机数为:\n");

    for(i=0;i<10;i++)

    data[i]=rand()%90+10;

    for(i=0;i<10;i++)

    printf("%d",data[i]);

    printf("\t");

    return 0;

    }

    这里产生了  然后怎么找次小值

    ------解决方案--------------------

    # include 

    # include 

    int main()

    {

    int a[10];

    int i;

    int * p; // always point to min

    int * q; // always point to second min

    int tmp;

    for (i = 0; i 

    a[i] = rand() % 100;

    for (i = 0; i 

    printf("%d\n", a[i]);

    if (a[0] 

    p = a, q = a + 1;

    else // otherwise, a[1] is min, a[0] is second min

    p = a + 1, q = a;

    for (i = 2; i 

    {

    if (a[i] 

    {

    q = p; // old min is new second min

    p = a + i; // a[i] is new min

    }

    else if (a[i] 

    {

    q = a + i; // a[i] is new second min

    }

    else // greater than second min

    {

    ; // we do nothing here

    }

    }

    printf("\nmin is: %d\n", *p);

    printf("second min is: %d\n\n", *q);

    tmp = *p;

    *p = *q;

    *q = tmp;

    for (i = 0; i 

    printf("%d\n", a[i]);

    return 0;

    }

    ------解决方案--------------------

    两次冒泡即可#include 

    int main(int argc, char **argv)

    {

    int num[10] = {12, 15, 4, 43, 23, 8, 1, 25, 64,10};

    int i, j, tmp;

    for(i = 0; i 

    for(j = 0; j 

    if(num[j] 

    tmp = num[j];

    num[j] = num[j+1];

    num[j+1] = tmp;

    }

    }

    }

    printf("the smallest is %d, the second small is %d\r\n",

    num[9], num[8]);

    }

    ------解决方案--------------------

    引用:# include 

    # include 

    int main()

    {

    int a[10];

    int i;

    int * p; // always point to min

    int * q; // always point to second min

    int tmp;

    for (i = 0; i 

    a[i] = rand() % 100;

    for (i = 0; i 

    printf("%d\n", a[i]);

    if (a[0] 

    p = a, q = a + 1;

    展开全文
  • 最快求最小值次小值

    千次阅读 2019-10-22 22:02:02
    本题目要求读入n个整数,要求用最少的比较次数,输出它们的最小值次小值。例如,对于12 13 1 10 34 1这6个数,最小值为1,次小值 为10。 输入格式: 输入有两行。第一行为整数个数n(≤1 000 000),第二行给出n...

    对代码的疑问:如果输入的某个数大于1000000怎么办?

    代码中有详细解释!但代码只适用于非负整数,有局限性。

    本题目要求读入n个整数,要求用最少的比较次数,输出它们的最小值和次小值。例如,对于12 13 1 10 34 1这6个数,最小值为1,次小值

    为10。

    输入格式:

    输入有两行。第一行为整数个数n(≤1 000 000),第二行给出n个以空格分隔的整数。

    输出格式:

    对每一组输入,在一行中输出最小值和次小值,中间以一个空格分隔,但行尾没有多余空格。如果输入数据不足两个,则输出“Invalid Input”。如果没有次小值,则输出“There is no second smallest element”。

    输入样例:

    6
    12 13 1 10 34 1 
    

    输出样例:

    1 10 
    

    思路:

    Java的题能用输入输出流就尽量别用Scanner!

    由于输入的数量n<=1000000,无论输入数据还是将输入的数据排序或比较,都有超时的陷阱,所以直接申请一个大数组,将输入的数据按照值对应的坐标放入数组中,这样就避免了排序或,直接从前往后寻找最大值和次小值就行了!

    //输入输出能用输入输出就尽量不用Scanner
    //类是动态加载的,eg:import java.io.*;不会影响效率,你的程序需要哪个类就会加载哪个类,但会加大class文件的大小
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    
    //BufferedReader比Scanner效率高不少!!!!
    public class 最快求最小值和次小值{
    	public static void main(String[] args) throws NumberFormatException, IOException {
    		/*
    		 * System.in的类型是InputStream,它代表的是键盘接受的输入,就是说键盘是数据源;
    		 * System.in的类型可以归结为节点流、字节流、输入流;
    		 * 接下来是InputStreamReader这个对象是处理流,字符流,输入流;
    		 * */
    		
    		/*
    		   read方法
                       功能:读取单个字符。
                       返回:作为一个整数(其范围从 0 到 65535 (0x00-0xffff))读入的字符,如果已到达流末尾,则返回 -1
    
               readLine方法
                       功能:读取一个文本行。通过下列字符之一即可认为某行已终止:换行 ('\n')、回车 ('\r') 或回车后直接跟着换行。
                       返回:包含该行内容的字符串,不包含任何行终止符,如果已到达流末尾,则返回 null 
            */
    		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    		//parseInt是解析数字字符串
    		int n = Integer.parseInt(br.readLine());
            if(n<2)
            	System.out.println("Invalid Input");
    		else {
    			String Str = br.readLine();//n<=1000000
    			String[] s = Str.split(" ");
    			int[] num = new int[1000000];//不用自动初始化为0,默认全是0
    			for(int i=0;i<n;i++){
    				//放在数组中等于从小到大排序
    				num[Integer.parseInt(s[i])]+=1;//如果输入的某个数大于1000000怎么办
    			}
    			int min1=-1,min2=-1,j=0;
    			for(int i=0;i<1000000;i++){
    				//6
    				//12 13 1 10 34 1 
                    if(num[i]!=0&&j==1){//次小值
    					min2 = i;
    					break;
    				}
    				if(num[i]!=0&&j==0){//最小值
    					min1 = i;j=1;
    				}
    			}
    			if(min2==-1){
    				System.out.println("There is no second smallest element");
    			}
    			else {
    				System.out.println(min1+" "+min2);
    			}
    		}
    	}
    }

    展开全文
  • 求数组最大最小值,平均,排序,寻找指定数据.rar,求数组最大最小值,平均,排序,寻找指定数据,shuzu_max_min_average.h,shuzu_max_min_average.c
  • 循环结束后接着第二循环一样利用if语句进行比较找次小值及其下标,但是要保证这时候的下标i不能等于m(最小值下标),这是为了防止干扰找次小值也避免了两个最小值是相等的情况。这样就成功找到了两个最小值及其...

    最近深入学习了数组,在老师的教导下练习了一些程序,做这道题的时候绞尽脑汁,还是没能在规定的时间完成,后来匆匆完成,d但又不太懂就今天又看了一遍,总结分享一下,希望能够帮助和我一样对这道题感到困扰的同学。

    目录

    题目:

    冒泡排序:

    根据冒泡排序找出10个数中最小的两个数:

     输出最小的两个数及其下标:

    方法一:

    方法二:

    方法三:


    题目:

    已知一个数组,找出其中最小的2个数及对应的下标,输出结果。

    拿到这道题呢,我首先想的是怎样找到最小的两个数,然后想到利用数组循环以及if语句大小比较可以找到最小的两个数,还可以利用冒泡排序,但是不知道怎么找到其相应的下标。

    冒泡排序:

    先巩固一下冒泡排序吧!

    #include<stdio.h>
    #define N 10
    int main()
    {
    	int i, j, t;
    	int a[N];
    	for (i = 0; i < N; i++)
    	{
    		scanf("%d", &a[i]);//首先输入这十个数
    	}
    	printf("\n");
    	for(j=0;j<N-1;j++)//十个数进行九趟循环
    	{ 
    		for (i = 0; i < N - 1 - j; i++)//每趟循环还要进行9-j次比较
    		{
    			if (a[i] > a[i + 1])//相邻的两个数依次进行比较
    			{
    				t = a[i];
    				a[i] = a[i + 1];
    				a[i + 1] = t;//根据比较交换数字大小,分别赋值给相应的数组
    			}
    		}
    	}
    	for (i = 0; i < N; i++)
    	{
    		printf("%d ", a[i]);//最后再依次从小到大的顺序输出这十个数
    	}
    	printf("\n");
    	return 0;
    }
    

    这是整个冒泡排序的过程,10个数要进行9趟循环,每趟循环还要进行9-j次比较,最后按照从小到大的顺序输出。

    根据冒泡排序找出10个数中最小的两个数:

    直接在return 0;前加上输出数组前两位结果就可。顺便看到了冒泡排序结果!

    结果实现如下图所示:

    watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5oCd57uq5LiH6Iyc,size_20,color_FFFFFF,t_70,g_se,x_16

     输出最小的两个数及其下标:

    方法一:

    后来探讨到可以这样找到下标

    #include<stdio.h>
    #define N 10
    int main()
    {
    	int a[N] = { 5,1,3,4,5,6,7,8,9,2 };
    	int i, m=0, n=0, t;
    	int min1 = a[0], min2 = a[0];
    	for (i = 0; i < N; i++)
    	{
    		if (min1 > a[i])
    		{
    			min1 = a[i];
    			m = i;
    		}
    	}
    	for (i = 0; i < 10; i++)
    	{
    		if (min2 > a[i] && i != m)
    		{
    			min2 = a[i];
    			n = i;
    		}
    	}
    	printf("最小值和次小值分别是:%d %d\n", min1, min2);
    	printf("他们对应的下标分别是:%d %d\n", m, n);
    	return 0;
    }
    

    先赋值两个最小值都为a[0]。然后进入for循环语句,利用if语句比较第一次循环找出最小值,同时记录此时的i值(也就是下标)。循环结束后接着第二次循环一样利用if语句进行比较找次小值及其下标,但是要保证这时候的下标i不能等于m(最小值下标),这是为了防止干扰找次小值也避免了两个最小值是相等的情况。这样就成功找到了两个最小值及其下标。但是这个程序的弊端在于直接给出了10个数而不是随机输入的。

    在这里我给出的是最小值相等的情况,运行结果如下图所示:

    方法二:

    后来参考了同学的代码利用scanf随机输入 

    #include<stdio.h>
    #define N 10
    int main()
    {
    	int a[N];
    	int i, m, n;
    	m = 0;
    	n = 0;
    	for (i = 0; i < N; i++)
    	{
    		scanf("%d", a[i]);
    		if (a[i] < a[m])
    			m = i;
    	}
    	for (i = 0, n = (m + 1) % 10; i < N; i++)
    	{
    		if (a[i] < a[n] && i != m)
    			n = i;
    	}
    	printf("最小值和次小值分别为:%d %d\n", a[m], a[n]);
    	printf("他们对应的下标分别为:%d %d\n", m, n);
    	return 0;
    }
    

    定义的变量很少,直接用a[m]和a[n]来表示最小的两位数,m、n分别表示其下表。也使用了两个for循环语句,直接在第一个循环中利用scanf输入随机值,if比较方法和方法一相同。不同的是在第二个for循环语句中下标n赋值为(m+1)%10,这样就继续了第一个循环中的大小比较,不用重复比较之前的大小。但是为什么要%10呢?我觉得这是为了防止下标m为9的情况,余10为0,然后继续开始第二轮的比较。这种方法真的很简便!

    运行结果如下所示:

    watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5oCd57uq5LiH6Iyc,size_20,color_FFFFFF,t_70,g_se,x_16

    方法三:

    根据我自己的理解也写出了scanf随机输入,以此补充

    #include<stdio.h>
    #define N 10
    int main()
    {
    	int a[N];
    	int i, m, n;
    	int min1, min2;
    	scanf("%d", &a[0]);
    	min1 = a[0], min2 = a[0];
    	for (i = 1; i < N; i++)
    	{
    		scanf("%d", &a[i]);
    		if (a[i] < min1)
    		{
    			min1 = a[i];
    			m = i;
    		}
    	}
    	for (i = 1; i < N; i++)
    	{
    		if (a[i] < min2 && i != m)
    		{
    			min2 = a[i];
    			n = i;
    		}
    	}
    	printf("最小值和次小值分别为:%d %d\n", min1, min2);
    	printf("他们对应的下标分别为:%d %d\n", m, n);
    	return 0;
    }
    

    首先把a[0]复制给两个最小值,然后在for循环语句中输入剩下的9个数并作比较,与第一种方法很类似。我觉得也挺好理解的。

    如下图运行结果:

    watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5oCd57uq5LiH6Iyc,size_20,color_FFFFFF,t_70,g_se,x_16

     关于scanf随机输入求两个最小值及其下标可参考方法二和方法三,觉得哪一种方法更好理解即可参考。

    以上就是我个人对这道题的理解和代码的实现,如果有错误的或者不足的地方欢迎指出,一起纠错。

    展开全文
  • S7-200SMART_搜索最大最小值库文件及使用说明
  • Max min.zip,最值寻找程序.vi
  • 以上这篇python寻找list中最大最小值并返回其所在位置的方法就是编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持软件开发网。 您可能感兴趣的文章:numpy找出array中的最大,最小值实例...
  • 汇编语言求最大值最小值
  • 它是完全矢量化的,而且速度非常快。 设计用于 EMD/HHT 算法。
  • 枚举算法,递归与分治策略,递归与迭代的思想、求最大值最小值、线性查找、二分查找与冒泡排序以及选择与交换排序、插入和希尔排序。本课程除了强调经典的算法理论和模型,亦兼顾编程实践能力。力图使得学员面对复杂...
  • 在向量中寻找局部最小值或最大的函数集,在向量中找到最接近某个的点,以及清除所有内容的函数。
  • 0. 函数的声明 可以看到:返回一个 std::pair<ForwardIt,ForwardIt> (pair 对) ...1. 寻找最小值和最大 使用 顾名思义,从函数名看,minmax_element,先是 min,再 max,所以,返回的
  • import numpy as np a = np.array([5, 6, 7, 8, 9, 10, 11, 12, 13, 14]) np.random.shuffle(a) # 打乱顺序 a_max = np.partition(a,-1)[-1] # 最大 ...a_2nd_min = np.partition(a,1)[1] # 次最小值
  • 【python】 求数组最小值,最大,最小偶数,最大奇数 lst = [3, 6, 1, 8, 1, 9 , 8,10,21] min=lst[0] max=lst[0] mi=lst[0] ma=lst[0] for i in lst : if i>max: max=i if min>i: min=i if i%2==0: ...
  • C++寻找最大值最小值

    千次阅读 2020-05-18 14:33:18
    各类型变量寻找最大 代码 vector寻找最大 #include <algorithm> #include <iostream> int main() { std::vector<double> v {1.0, 2.0, 3.0, 4.0, 5.0, 1.0, 2.0, 3.0, 4.0, 5.0}; std::...
  • 因此,我正在处理的问题是“编写,调试和测试程序来计算和... “所以这就是我现在所拥有的,但我仍然坚持寻找最小值,最大和平均 .def scores():print('we are starting')count = int(input('Enter amount of ...
  • matlab寻找矩阵最小值

    千次阅读 2021-05-06 01:08:47
    硕士生考查课程考试试卷 考试科目: 考生姓名: 学院: 考生成绩:任课老师 (签名) MATLAB 教程 考生学号:专业: 考试日期:20 年月日午 时至 时 《MATLAB 教程》试题: A、利用 MATLAB 设计遗传算法程序,寻找下图 11 个...
  • list1 = [-2,3,-5,7,8,9] print( "最大是%d,下标是%d" % (max(list1),list1.index(max(list1))) ) print( "最小值是%d,下标是%d" % (min(list1),list1.index(min(list1))) )
  • dataframe 找最值
  • public class MapMinMaxvalue { public static void main(String[] args) { Map map=new HashMap(); map.put(“2”, 5);... } } 获取Map中Value()的最小值======2 获取Map中Value()的最大=====28
  • 找数组最小值次小值的方法

    千次阅读 2015-05-31 23:10:18
    对数组进行一遍历找出其最小值次小值 int min1 = 10000; int min2 = 10000; int ind1 = -1; int ind2 = -1; for (int j = 0; j ; j++) { if (ht[j] ) { min2 = min1;
  • 找出数据集合中的最小值和最大的两种算法比较...通常寻找最大值最小值的方法方法一:void max_min(int* array,int size,int* max){int tmp = 0;for(tmp = 0,*max = array[0];tmp < size;tmp++){*max = *max...
  • 对输入的数组寻找出其最大最小值,并输出。 【实验内容】 根据实验要求和伪码信息,用插入排序的方法对输入的数组A进 行排序。使得最后的输出数组为输入数组内元素的递增顺序排列。
  • 求Numpy数组的最小值和最大

    千次阅读 热门讨论 2021-11-10 22:06:22
    求Numpy数组的最小值和最大
  • 在项目中经常会用到对vector容器中的数据求最大或者最小值,这里简单总结下vector的常用方法,方便后续快速查找回顾。 一 vector 查找最大最小值,及其位置 int main() { vector<float> heights; heights....
  • 主要执行参考用法:usage_proclivityStateTracking.m * 每个趋势数据点的时间间隔要大-------------------------------------------------- -------------------------- 目的是说明局部最大最小值或平台的识别。...
  • c代码-运用指针计算10个元素数组中最大值最小值并返回在数组中的位置

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 81,296
精华内容 32,518
关键字:

寻找最小值次小值