求解数组的最小2个元素

liuzu2016 2012-06-15 10:05:30
void fun(int* arr,int pos, int* s, int* t,int n);

功能:int arr[n];求解a[0:pos] 里的最小两个值,*和*t.

pos<n;


求解最通俗的算法,并附思路说明,不能修改数组,所以不能排序

我脑子不好使啊,
...全文
92 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
只是很想懂 2012-06-17
  • 打赏
  • 举报
回复
我觉得思路可以模仿一下。差不多的。[Quote=引用 8 楼 的回复:]

/*
* 在n行n列的数组里面按一下要求选出两个数。首先从每行选出最大的数,再从n个最大的数里面选出一个最小的数;
* 其次,从每行选出最小的数,再从选出的最小的数里面选出一个最大的数。
* */
#include <stdio.h>
#include <conio.h>
#include<stdlib.h >

#define MAXN 20

int a[MAXN……
[/Quote]
只是很想懂 2012-06-17
  • 打赏
  • 举报
回复
/*
* 在n行n列的数组里面按一下要求选出两个数。首先从每行选出最大的数,再从n个最大的数里面选出一个最小的数;
* 其次,从每行选出最小的数,再从选出的最小的数里面选出一个最大的数。
* */
#include <stdio.h>
#include <conio.h>
#include<stdlib.h >

#define MAXN 20

int a[MAXN][MAXN] ;
void main(void)
{
int max ; /*save max value*/
int min ; /*save min value*/
int row , col , n ;
system("cls");
printf(" please input the elements of the matrix : \n ") ; /* 输入方阵的阶次*/
scanf(" %d " , &n ) ;
printf(" please input the order of the matrix \n from a[0][0] to a[%d][%d] : \n " , n-1 , n-1 ) ;
for(row = 0 ; row < n ; row ++)
{
for(col = 0 ; col < n ; col ++)
{
scanf( " %d" , &a[row][col] ) ;
}
}

for(max = a[0][0] , row = 0 ; row < n ; row ++)
{

/* choose the min value from row*/

for(min = a[row][0] , col = 0 ; col < n ; col ++)
{

if(min > a[row][col]) /*save min value from row */
{
min = a[row][col] ;
}
if( min > max)
{
max = min ;
}
}
}
printf(" the maxxnum of minxnum is %d :\n " , max ) ;

for(min = a[0][0] , row = 0 ; row < n; row ++)
{

for( max = a[row][0] , col = 0 ; col < n ; col ++)
{

if( min > a [row][col]) /* save the max value every row*/
{
max = min ;
}
if(max < min )
{
max = min ;
}
}
}
printf(" the minxnum of maxxnum is : %d \t " , min ) ;
getch() ;
}




Binzo 2012-06-16
  • 打赏
  • 举报
回复

for(...){
if(a>b)
c = b;
}
十八道胡同 2012-06-16
  • 打赏
  • 举报
回复
思路就是用2个变量来存贮 最小值和次小值 就可以了。
数组走一遍就找到了。o(n)
pathuang68 2012-06-16
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]

多谢, 我确是搓

写错了算法了

现在的问题是:

如何找最小 两个数字的下标呢

前提依然是 不能修改数组的



引用 4 楼 的回复:
引用楼主 的回复:
C/C++ code
void fun(int* arr,int pos, int* s, int* t,int n);

功能:int arr[n];求解a[0:pos] 里的最小两个值,*和*……
[/Quote]

哥们,稍改一下就行了。

#include <stdio.h>
#include <stdlib.h>
void fun(int* arr, int pos, int* s, int* t, int* ss, int* ts, int n) // 增加两个参数ss和ts,用于返回*s和*t的下标
{
if(pos < 1 || pos > n -1)
{
printf("参数错误\n");
return;
}

int min1; // 最小的数
int min2; // 第二小的数

// 给min1和min2赋初值,min1为*(arr + 0)和*(arr + 1)中较小的一个,min2为另一个。
if(*(arr + 0) < *(arr + 1))
{
min1 = *(arr + 0);
min2 = *(arr + 1);
*ss = 0;
*ts = 1;
}
else
{
min1 = *(arr + 1);
min2 = *(arr + 0);
*ss = 1;
*ts = 0;
}

// 从下标2开始到pos为止,遍历数组
for(int i = 2; i <= pos; ++i)
{
if(*(arr + i) < min2) // 如果数组中的元素小于min2
{
if(*(arr + i) < min1) // 判断该元素是否小于min1
{
int temp = min1;
min1 = *(arr + i);
min2 = temp;
*ts = *ss;
*ss = i;
}
else
{
min2 = *(arr + i);
*ts = i;
}
}
}

*s = min1;
*t = min2;
}

int main(int argc, char* argv[])
{
int min1;
int min2;

int ss;
int ts;

int arr[] = {1, 3, 77, 33, 26, 179, 2, 9, 8, 7, 4, 11, 99};

fun(arr, 6, &min1, &min2, &ss, &ts, sizeof(arr) / sizeof(int));

printf("The minimum two numbers are:%d, %d, \nthe corresponding subscript is %d, %d respectively.\n", min1, min2, ss, ts);

return 0;
}
liuzu2016 2012-06-16
  • 打赏
  • 举报
回复
多谢, 我确是搓

写错了算法了

现在的问题是:

如何找最小 两个数字的下标呢

前提依然是 不能修改数组的



[Quote=引用 4 楼 的回复:]
引用楼主 的回复:
C/C++ code
void fun(int* arr,int pos, int* s, int* t,int n);

功能:int arr[n];求解a[0:pos] 里的最小两个值,*和*t.

pos<n;


求解最通俗的算法,并附思路说明,不能修改数组,所以不能排序

我脑子不好使啊,


遍历一遍就OK了,easy

C/C++ ……
[/Quote]


pathuang68 2012-06-16
  • 打赏
  • 举报
回复
[Quote=引用楼主 的回复:]
C/C++ code
void fun(int* arr,int pos, int* s, int* t,int n);

功能:int arr[n];求解a[0:pos] 里的最小两个值,*和*t.

pos<n;


求解最通俗的算法,并附思路说明,不能修改数组,所以不能排序

我脑子不好使啊,
[/Quote]

遍历一遍就OK了,easy

#include <stdio.h>
#include <stdlib.h>
void fun(int* arr, int pos, int* s, int* t, int n)
{
if(pos < 1 || pos > n -1)
{
printf("参数错误\n");
return;
}

int min1; // 最小的数
int min2; // 第二小的数

// 给min1和min2赋初值,min1为*(arr + 0)和*(arr + 1)中较小的一个,min2为另一个。
if(*(arr + 0) < *(arr + 1))
{
min1 = *(arr + 0);
min2 = *(arr + 1);
}
else
{
min1 = *(arr + 1);
min2 = *(arr + 0);
}

// 从下标2开始到pos为止,遍历数组
for(int i = 2; i <= pos; ++i)
{
if(*(arr + i) < min2) // 如果数组中的元素小于min2
{
if(*(arr + i) < min1) // 判断该元素是否小于min1
{
int temp = min1;
min1 = *(arr + i);
min2 = temp;
}
else
{
min2 = *(arr + i);
}
}
}

*s = min1;
*t = min2;
}

int main(int argc, char* argv[])
{
int min1;
int min2;

int arr[] = {1, 3, 77, 33, 26, 179, 2, 9, 8, 7, 4, 11, 99};

fun(arr, 6, &min1, &min2, sizeof(arr) / sizeof(int));

printf("%d, %d\n", min1, min2);

return 0;
}
liuzu2016 2012-06-15
  • 打赏
  • 举报
回复
void fun(int arr[], int len, int& m, int & n)
{
//参数不检查,不是重点


int nPos;

m=arr[0];

n=arr[1];

for(nPos=1; nPos< len; nPos++)
{
if( arr[nPos]< m)
m=arr[nPos];
if( arr[nPos]>m && arr[nPos]<n)
n=arr[nPos];

}

}

这个算法对不对??


如果对的话

对题目修改:

改成求解最小的两个元素的下标,

改了后,我发现,好难啊



W170532934 2012-06-15
  • 打赏
  • 举报
回复
定义一个最小值,一个次小值变量,初始化为数组的第一个元素和第二个元素,依次扫描数组,进行比较。

69,322

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧