精华内容
下载资源
问答
  • 题目:在组数字中找出最大和第二大的两个 要求:只能遍历次数组 思路:定义两个变量max和second, #include<stdio.h> #include<stdlib.h> void Find_Two_MaxNum(int a[], int...

    题目:在一组数字中找出最大和第二大的两个数

    要求:只能遍历一次数组


    思路:定义两个变量max和second,

    #include<stdio.h>
    #include<stdlib.h>
    
    void Find_Two_MaxNum(int a[], int size, int*max,int *second)
    {
    	for (int i = 0; i < size; i++)
    	{
    		if (a[i]>*max)//如果当前值大于*max,先将*max值交给*second保存,然后更新*max
    		{
    			*second = *max;
    			*max = a[i];
    		}
    		else if(a[i]<*max&&a[i]>*second)//如果当前值小于*max,则要判断它与*second的大小来确定要不要更新*second
    		{
    			*second = a[i];		
    		}
    	}
    }
    int main()
    {
    	int arr[] = { 1, 2, 4, 3,5 };
    	int size = sizeof(arr) / sizeof(arr[0]);
    	int max = arr[0];
    	int second = arr[0];
    	Find_Two_MaxNum(arr, size, &max, &second);
    	printf("最大的数字为:%d\n", max);
    	printf("第二大的数字为:%d\n", second);
    	system("pause");
    	return 0;
    }

    结果:

    但是如果数组内容换成[5,1,4,3,2]就有问题了,原因是:最开始默认5是最大和次大值,之后的数字都比5小,就不会进入第一个if语句,然后second值没更新,一直是5;此外,由于max和second值都为5,第2个if语句也不会进入。所以结果出错

    正确思路:初始时*max与*min的值不能设置在同一位置,不然更新的时候会容易越过去。

    正确代码:

    #include<stdio.h>
    #include<stdlib.h>
    
    void Find_Two_MaxNum(int a[], int size, int*max,int *second)
    {
    	//第一步:先找出前两个中较大数和较小数,分别赋值给*max和*second
    	*max = a[0];
    	*second = a[0];
    	if (a[0] > a[1])
    	{
    		*second = a[1];
    	}
    	else
    	{
    		*max = a[1];
    	}
    	//第二步:遍历数组,更新值
    	for (int i = 1; i < size; i++)
    	{
    		if (a[i]>*max)//如果当前值大于*max,直接更新*max
    		{
    			*max = a[i];
    		}
    		else if(a[i]<*max&&a[i]>*second)//如果当前值小于*max,则要判断它与*second的大小来确定要不要更新*second
    		{
    			*second = a[i];		
    		}
    	}
    }
    int main()
    {
    	int arr[] = { 1,9,4,3,2 };
    	int size = sizeof(arr) / sizeof(arr[0]);
    	int _max = 0;
    	int _second =0;
    	Find_Two_MaxNum(arr, size, &_max, &_second);
    	printf("最大的数字为:%d\n", _max);
    	printf("第二大的数字为:%d\n", _second);
    	system("pause");
    	return 0;
    }

    运行结果:

    展开全文
  • 最大10的的索引(位置),可先按降序排序,得到索引号,然后将前10个取出即可。 建议方法:order(x,decreasing=TRUE)[1:10] 过程详解: 1、测试数据x> x [1] 0.00 0.00 0.00 0.00 0.00 0.00 0.06 0.09 0.20 ...

    一、向量

    最大10的数的索引(位置),可先按降序排序,得到索引号,然后将前10个取出即可。
    建议方法:
    order(x,decreasing=TRUE)[1:10]
    过程详解:
    1、测试数据x

    > x
    [1] 0.00 0.00 0.00 0.00 0.00 0.00 0.06 0.09 0.20 0.09 0.08 0.14 0.14 0.23
    [15] 0.08 0.06 0.12 0.20 0.14 0.11 0.20 0.14 0.17 0.15 0.18 0.15 0.20 0.12
    [29] 0.23 0.08 0.12 0.08 0.23 0.12 0.08 0.17 0.18 0.17 0.12 0.17 0.14 0.18
    [43] 0.11 0.27 0.06


    2、按降序排序

    > order(x,decreasing=TRUE)
    [1] 44 14 29 33  9 18 21 27 25 37 42 23 36 38 40 24 26 12 13 19 22 41 17 28
    [25] 31 34 39 20 43  8 10 11 15 30 32 35  7 16 45  1  2  3  4  5  6
    >


    3、这里就能取出最大10个数的索引了
    > order(x,decreasing=TRUE)[1:10]
    [1] 44 14 29 33  9 18 21 27 25 37


    4、可以看一下,这取出的10个数的索引是不是指向最大的十个数。
    > x[order(x,decreasing=TRUE)[1:10]]
    [1] 0.27 0.23 0.23 0.23 0.20 0.20 0.20 0.20 0.18 0.18

    二、矩阵

    首先设定有矩阵y,9行5列,求最大的10个数的索引。

    > y

          [,1] [,2] [,3] [,4] [,5]
    [1,] 0.00 0.09 0.14 0.12 0.18
    [2,] 0.00 0.08 0.11 0.23 0.17
    [3,] 0.00 0.14 0.20 0.08 0.12
    [4,] 0.00 0.14 0.14 0.12 0.17
    [5,] 0.00 0.23 0.17 0.08 0.14
    [6,] 0.00 0.08 0.15 0.23 0.18
    [7,] 0.06 0.06 0.18 0.12 0.11
    [8,] 0.09 0.12 0.15 0.08 0.27
    [9,] 0.20 0.20 0.20 0.17 0.06

     

     

    解答方法:

     

     

    1、使用sort.list()进行排序

    > arrayInd(sort.list(y,decreasing=T)[1:10],dim(y))
          [,1] [,2]
    [1,]    8    5
    [2,]    5    2
    [3,]    2    4
    [4,]    6    4
    [5,]    9    1
    [6,]    9    2
    [7,]    3    3
    [8,]    9    3
    [9,]    7    3
    [10,]    1    5

     

     

     

    2、使用order()函数进行排序

    错误的方法:

    > arrayInd(which(order(y, decreasing = TRUE) <= 10), dim(y))
          [,1] [,2]
    [1,]    5    1
    [2,]    3    4
    [3,]    4    4
    [4,]    1    5
    [5,]    4    5
    [6,]    5    5
    [7,]    6    5
    [8,]    7    5
    [9,]    8    5
    [10,]    9    5

    which(order(y, decreasing = TRUE) <= 10)含义是先将数据进行排序,然后取索引小于等于10的,最大的10个数在排完序后,索引不应是<=10,而是排在前10位的就是最大的10个数的索引。
    正确的方法:
    > arrayInd(order(y,decreasing=TRUE)[1:10],dim(y))
          [,1] [,2]
    [1,]    8    5
    [2,]    5    2
    [3,]    2    4
    [4,]    6    4
    [5,]    9    1
    [6,]    9    2
    [7,]    3    3
    [8,]    9    3
    [9,]    7    3
    [10,]    1    5

    展开全文
  • 出一个N*N的二维数组,求其中的最大数和其所在的行号、号(均从0开始计算)。 Input 第1行是个正整数N(2≤N≤10),表示二维数组的大小。后跟N行,每行N个数据之间用个空格分隔。 Output 输出最大数...
    /*Description
    给出一个N*N的二维数组,求出其中的最大数和其所在的行号、列号(均从0开始计算)。
    Input
    第1行是一个正整数N(2≤N≤10),表示二维数组的大小。后跟N行,每行N个数。
    数据之间用一个空格分隔。
    Output
    输出最大数,及其所在的行号和列号,中间用一个空格分隔。如果有多个数都是最大,
    则输出第1个的位置。
    Sample Input
    5
    1 2 3 4 5
    1 2 3 4 5
    1 2 3 4 5
    1 2 3 4 5
    1 2 3 4 5
    Sample Output
    5 0 4
    HINT
    若最大数有多个,则输出第一个。*/
    
    #include <stdio.h>
    #define N 8
    
    int main()
    {
    	int a[N][N],i,j,b,c,max,n;
    	
    	scanf("%d",&n);
    	if(n >= 2 && n <= 10);//判断是否满足条件 
    	else
    	{
    		printf("输出错误!请重新输入!");
    		return 0; 
    	}
    	
    	scanf("%d",&a[0][0]);
    	max = a[0][0];
    	b = c = 0;
    	for(i = 0;i < n;i++)
    	{
    		for(j = 0;j < n;j++)
    		{
    			if(i == 0 && j == 0) j = 1;
    			scanf("%d",&a[i][j]);
    			if(max < a[i][j])
    			{
    				b = i;
    				c = j;
    				max = a[i][j];
    			}
    		}
    	}
    	
    	printf("%d %d %d",max,b,c);
    }
    

    不能单纯的将max初始化成0来作比较,因为数组里的数据可能是负数

    展开全文
  • 创建时间:2006年5月28属性:原创内容简介:快速排序,堆排序关键字:快速排序,堆排序,排序前序从某网上看到google的面试题目,要求从1000000个中选出10个最大,题目好像有些挑战性,想了半天,只知道用快速...

    创建时间:2006年5月28
    属性:原创
    内容简介:快速排序,堆排序
    关键字:快速排序,堆排序,排序


    前序

    从某网上看到google的面试题目,要求从1000000个数中选出10个最大的数,题目好像有些挑战性,想了半天,只知道用快速排序或堆排序或者归并排序比较好,于是开始动手写写。


    一.随即生成数字(异常就懒得写了)

    void CreateTheDataFile(long *&data, long &count)// data为引用一个指针,以便传回生成的数组
                                                                                               // count为data数组中数据的个数
    {
     char num[9] = {'/0'};
     CFile file;
     if(!file.Open("num.dat",
      CFile::modeReadWrite |
      CFile::modeCreate |
      CFile::shareDenyNone |
      CFile::typeBinary))
      return;
     srand((long)time(NULL));
     for (int i = 0; i< 0xFFFFF; i++) //生成1000000个数字
     {
      int j = rand(); //随机生成数字
      int temp = j;
      int k = 0;   // 数字的位数
     
       if (j % 10 != 0)
      {
       for(;j % 10 != 0;) // 以下生成数字的位数
       {
        j /= 10;
        k++;
       }
      }
      else
      {
       for(;j > 0;) // 以下生成数字的位数
       {
        j /= 10;
        k++;
       }
      }
      j = temp;
      _itoa(j, num, 10);
      file.Write(num, k); // 只写k位数字
      file.Write("/n", 1);
     }
     /**/
     long *num2 = new long[0xFFFFFF]; //申请16M的空间,存储要比较的整数
     if (num2 == NULL)
      return;
     memset(num2, '/0', sizeof(num2));
     char num3[2048] = {'/0'};
     char num5[1][9]; // 存放字符串,表示一个整数字符串
     memset(num5[0], '/0', sizeof(num5));
     file.SeekToBegin();
     long i2 = 0, j = 0, k = 0;
     for (DWORD ii = 0; ii<=file.GetLength();)
     {
      if(!file.Read(num3, sizeof(num3)))
      return;
     
      for (i2 = 0 ; i2< sizeof(num3); i2++) // 把含有“/n”的字符给分离出来
      {
       if (num3[i2] != '/n') // 如果不是换行符,则是数字字符,把其提出来
        num5[0][j++] = num3[i2];
       else // 出现换行符,则表示提出来的字符完成了,应该转换成整数,
       {
        num2[k] = atoi(num5[0]);
        memset(num5[0], '/0', sizeof(num5)); // 清空,以便下次用
        k++;
        j = 0;
        continue;
       }
      }
       // 清空num3,以便正确统计k
      memset(num3, '/0', sizeof(num3));
      ii += sizeof(num3);
     }
     file.Close();
     data = num2;
     count = k;
    }


    二.快速排序和堆排序

    考虑到快速排序用递归的时候可能导致栈溢出(即使设置编译参数调整默认堆栈大小大于1M也不行),只好用非递归算法了,关于堆排序很简单。以下为排序算法:

    void QuickSort(long data[], long low, long high) // 非递归算法
    {
     long pivotpos = low, i, j, ii = 0, jj = 0;
     long lo = 0, hi = 0;
     if (low < 0 || high <0 || low >= high)
      return;
     long **Qstack = new long*[2]; // 申请一个二维数组
     for(i = 0; i<2; i++)
     {
      Qstack[i] = new long[0xFFFFF];
     }
     Qstack[0][ii++] = low; // 记录低位数值
     Qstack[1][jj++] = high; // 记录高位数值
     long PivotNum = data[pivotpos];
     while(1)
     {
      lo = Qstack[0][--ii];
      hi = Qstack[1][--jj];
      i = lo;
      j = hi;
      PivotNum = data[lo];
      do
      {
       while(data[j] >= PivotNum && i < j) j--;
       if(i < j)
        data[i] = data[j];
       while(data[i] <= PivotNum && i < j) i++;
       if(i < j)
        data[j] = data[i];
      }while(i < j);
      data[i] = PivotNum; // 基准值对位
      pivotpos = i;
      /* // 对pivotpos的左边进行排序
      if(low < pivotpos - 1)
       QuickSort(num, low, pivotpos - 1);
      */
      if(lo < pivotpos - 1)
      {
       Qstack[0][ii++] = lo;
       Qstack[1][jj++] = pivotpos - 1;
      }
      /* // 对pivotpos的右边边进行排序
      if(pivotpos + 1 < high)
       QuickSort(num, pivotpos + 1, high);
      */
      if(pivotpos + 1 < hi)
      {
       Qstack[0][ii++] = pivotpos + 1;
       Qstack[1][jj++] = hi;
      }
      if (ii <= 0)
       break;
     }
     delete []Qstack[0];
     delete []Qstack[1];
    }

    void HeapSift(long data[], long i, long count)  // 堆筛选,对第i个数进行筛选,构造初始堆(大堆)
    {
     long j = 2 * i +1;
     long temp = data[i];
     while(j <= count - 1)
     {
      if(i < count - 1 && data[j] < data[j + 1])
       j++;
      if(temp < data[j] )
      {
       data[i] = data[j];
       i = j;
       j = 2 * i + 1;
      }
      else
       break;
     }
     data[i] = temp; //找到位置,放回temp
    }
    void HeapSort(long data[], long count) // 堆排序
    {
     long temp;
     long i = count / 2 - 1;
     for (; i >= 0; i--)
      HeapSift(data, i, count); //对每个数进行筛选
     for (i = 1; i <= count - 1; i++) //取出最大值,与堆尾的书进行交换
     {
      temp = data[0];
      data[0] = data[count - i];
      data[count - i] = temp;
      HeapSift(data, 0, count - i); //再进行筛选
     }
    }


    三.消息函数(我用的是MFC了,当然Win32也行)

    消息映射就不写了,大同小异.
    void OnQuickSort()
    {
     long *data, count;
     long result[10];
     CreateTheDataFile(data, count); // 生成数据文件
     QuickSort(data, 0, count-1); // 开始排序
     OutPutTensMaxNums(data, result, count); // 输出结果
     delete []data;
    }

    void OnHeapSort()
    {
     long *data, count;
     long result[10];
     CreateTheDataFile(data, count); // 生成数据文件
     HeapSort(data, count);
     OutPutTensMaxNums(data, result, count); // 输出结果
     delete []data;
    }


    四.输出结果(弹出对话框)

    void OutPutTensMaxNums(long data[], long result[10], long CountOfNum)
    {
     long pos = CountOfNum - 10;
     char ResultOfNum[9*10 + 1]; //存放显示的结果
     char ResultOfTemp[12];
     memset(ResultOfNum, '/0', sizeof(ResultOfNum));
     memset(ResultOfTemp, '/0', sizeof(ResultOfTemp));
     for (int i = 0; i< 10; i++)
     {
      result[i] = data[pos++];
      itoa(result[i], ResultOfTemp, 10);
      strcat(ResultOfNum, ResultOfTemp);
      strcat(ResultOfNum, "/n");
     }
     AfxMessageBox(ResultOfNum);
    }


    五.后记

    1.经过测试,以上两个排序算法对1000000个数字进行完全排序大约要几秒钟的时间(cpu p4 2.6G),如果不生成数据文件存到硬盘中那就很省时,关键是生成数字存与读很浪费时间。当然由于自身功底的问题,我暂时还想不到用其他更好的算法(周末去书店看了半天 Donald E. Knuth的《The Art of Computer Programming》也没看懂,网上也找不到更合适的算法,呵呵)。感觉而言,HeapSort在此排序中比较快(无可厚非QuickSort的算法了,总体而言,这是最快的排序算法了!),如果只找出10个的的数字,那么HeapSort可能更快(QuickSort大概也行,我懒得想了,近来的了颈椎病,一考虑问题就头疼,特别是不能低着头看书或搞电脑,原谅!),QuickSort的递归算法只能排大约100个数字,否则就堆栈溢出(因为前面有些数据占用堆栈的空间较大),当然不是一个好的解决办法,非递归更好一些,但占用堆的空间较大,而HeapSort则好一点。MergeSort在这里没有写出,不知什么时间开销,DS书中都称这三个都差不多,而QuickSort更好一点。
    2.代码运行中占用内存空间较大70M左右,这可能是个最烂的算法了,前面申请的内存空间太大了,当然有更高效的算法,时间关系就不想了,笨想法就用笨方法解决好了,暂时只是要个结果。
    3.以上代码写的很乱,加上思考这个问题的时间零零散散,所以就没什么水平了,望看到这篇文章的各位原谅!


    六.参考书目

    1.《数据结构辅导与提高》徐孝凯,清华大学出版社
    2.《数据结构(C语言版)》严蔚敏 吴伟民,清华大学出版社
    3.《数据结构题集(C语言版)》严蔚敏 吴伟民,清华大学出版社)》
    4.网络(这里不列出了)

    展开全文
  • import java.util.Arrays; import java.util.Scanner;...小易会找出棋盘中某一列中拥有相同颜色的最大的区域去涂画, * 帮助小易算算他会涂画多少个棋格。 * * @author pomay * */ public class Wang
  • 问题描述:  有一张表File_Info,有若干字段,其中有2个字段FileName(文件名称)和FileVer(文件版本号)。... 要求查询FileName字段重复时,FileVer值最大的所有数据。 SQL语句如下: 1 SEL...
  • 本文意在求某二维数组中, 最大值, 且最大值所在行数和列数. ...其次, 我们要得到行数 , 列数最大值, 我们得先申请变量分别来接收 行数, 列数最大值的数值; 然后我们得申请变量代表我们的元...
  • 给定个整数组,找出其中两个相加等于目标值 例如:给定数组及目标值 nums = [2,7,11,15] ,target = 9 因为nums[0] + nums[1] = 2 + 7 = 9 返回[0,1] /** * 使用辅助空间(使用哈希表,时间复杂度是O...
  • 求二维数组每一列(行)上的最大值 含有以下两个部分: 求二维数组每一列上的最大值 求二维数组每一行上的最大值 行最大值 问题描述 输入二维数组的行数n、列m,并输入二维数组,用数组输出每行的最大值 输入...
  • //在个动态录入的二维数组中找到最大,最小值并输出值和他所在的行和 #include <stdio.h> int main() { int a[3][4]; int max;//最大值 int m1;//最大值的行数 int n1;//最大列数 int m2;/...
  • C语言:找出中间的数字

    万次阅读 2019-01-20 20:26:04
    输入三个整数,找出其中的中间(根据数值大小)。 输入 输入3个整数。 输出 输出中间 样例输入 样例输出 #include&lt;stdio.h&gt; void swap(int *x,int *y) { int t=*x; *x=*y; *...
  • Rank()函数的使用:返回某数字再一列数字中相对于其他数值大小排名 1.首先在第一个需要排名的空输入=RANK() 2.然后输入需要排序的第一个数值的位置 3.再输入需要排序的范围,要绝对引用,即在字母和数字前加$,...
  • 功能:从个矩阵中找出全局的最大值和最小值。 函数cv::minMaxLoc找出最大和最小元素的值和他们的位置。极值是遍历整个矩阵找到,或者当掩码不是个空矩阵时,是通过遍历指定矩阵区域找到。 函数不适用于多通道...
  • [图片说明](https://img-ask.csdn.net/upload/201807/22/1532263598_743176.png)如图,数字代表不同的字符串,我想知道用什么方法可遍历以做到找到每一列中最长的字符串的长度。 注意,图只是一种情况,已知字符串...
  • 题目:对于个".bmp"图片,获取其像素值的大小和个 解析:废话不多说,直接上已经调试好的程序 #define _CRT_SECURE_NO_WARNINGS #include using namespace std; #include #include #include #include #...
  • 用C语言来实现1~100共百个自然数,放入个99个元素的数组a[99],找出没有放入的那个元素 对问题的分析 首先,按照我们常规的思路来看。我们会按部就班的按顺序将100个依次填入数组,然后先打乱再依次去掉。或者...
  • 1、打印文件的第一列(域) : awk '{print $1}' filename2、打印文件的前两列(域) : awk '{print $1,$2}' filename3、打印完第一列,然后打印第二列 : awk '{print $1 $2}' filename4、打印文本文件的总行 :...
  • 在这系列呢,打算把自己每次被问到的仔细思考过的一些题都总结下来。方便自己去温习吧,也给大家参考一下我的思路。文章结构:(1)题目描述;(2)快排思路解法;(3)堆排思路解法;(4)其他解法思路待续。
  • 代码: :定义三个维数组 #include&lt;stdio.h&gt; #include&...//在使用字符串处理函数时,需要...//定义3个接下来需要比较大小的字符串数组,以及个存放最大字符串数组的数组。  gets(a);  ge...
  • 基本步骤: 分解:将原问题分解为若干个规模较小、相互独立,与原问题形式相似的子问题; 解决:若子问题规模较小而容易被解决则直接解,否则再继续分解为更小...求子问题的解之后,就可以推解原问题的解。#incl
  • #窗口大小,可以看出来是5,左边2个右边2个 def _nms_5(data): length=len(data) ans=[] for i in range(2,length-2): if data[i]&gt;data[i-1] and data[i]&gt;data[i-2] and data[i]&gt;data[i+1]...
  • 项目背景:因为最优点的推力和主流率,以及最优点的推力和阳极电流的一一对应关系的稳态编表需要用MATLAB拟合,所以本小节主要是介绍工作过程中发现的MATLAB的 对一列存在小数点后有着固定有效位,数值重复数字的...
  • MySQL查询数据的众数和中位

    千次阅读 2019-03-05 14:00:41
    查询数据的众数: 方法1:仅适用于数据只有个众数的情况 1)首先对数据按照值的不同进行分组,并对每组中的数据进行计数,再根据计数的大小进行降序排序;... 2)使用max函数找出统计个的...
  • * 找出数组中所有的具有这类性质的元素及其位置:该元素在所在行是最大的,但在其所在是最小的。 * 如果没有这样的元素,则输出“没有这样的元素”。 * @remakeTODO * @author Conqu...
  • 在实际应用的时候,我们往往会收集多个维度的特征值。然而这些特征值未必都能派上用场。...因此,最佳方式是找到相关性最大的几个特征值来训练模型。 那么,如何才能找到相关性最大的几个特征值呢? ...
  • 在之前的总结中提到过对拼接而成的复合的DataTable按照某一列值的大小排序,那个主要的思想是在新建表结构时将要排序的那一列的值设为int型。 但是在实际的开发中,可能会需要按照某一列的值排序,而数值可能为整型...
  • 用vi删除某一列

    千次阅读 2018-08-06 17:47:28
    vi 中如何一次删除多列?  如:  123aaaaa  !@#aaaaa  ABCaaaaa  +-/aaaaa  在 vi 中如何一次删除前 3 列呢? 最简单的方法: ...具体讲,光标先移动到第一行,第一列,然后按ctrl + v, 然后把...
  • MTU = MSS + TCP Header + IP Header.   mtu是网络传输最大报文包。 mss是网络传输数据最大值。...MSS:maximum segment size,最大分节大小,为TCP数据包每次传输的最大数据分段大小,一般由发送端向对端...
  • sql语句,如何找出重复的数据

    万次阅读 2017-11-08 11:24:50
    --1、用于查询重复处理记录(如果没有大小关系时2000用生成自增和临时表处理,SQL2005用row_number函数处理) --> --> (Roy)生成測試據 if not object_id('Tempdb..#T') is null  drop table #T ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 188,163
精华内容 75,265
关键字:

一列数据大小找出最大数