user-0 提问: 怎么找数组中的最小值和次小值

回复:
user: user-1
content: 怎么感觉刚讲的堆排序刚好可以使用，只不过有点大材小用 。。。 建议在照一次最小值（期间出现与第一次最小值相同的不算），然后将就可以交换了 思想应该就这样

user: user-2
content: 不要每次取出一个值进行比较，这样比较的次数是2n-2, 而是一个取出2个值，首先进行比较，然后再与最小和次小比较，这样取出2个值比较的次数是3，最后整体的次数的3（n/2）. 比2n-2要少。

user: user-3
content: 应该输出两个 printf("%d %d \n",min1,min2);

user: user-3
content: 引用 35 楼 zxh707wk 的回复:可以直接用一次循环 代码： #include <stdio.h>  int main() { 	int i; 	int t; 	int a[]={2,3,4,2,0,5,8,6,1,8,4,3,7}; 	int min1=a[0]; 	int min2=a[1]; 	if(min1>min2) 	{ 		t=min1; 		min1=min2; 		min2=t; 	} /*到此，min和min2将数轴分成三段，其后的任一个a[i]只能是a[i]<=min1,   min1<a[i]<=min2, min2<a[1] 只需考虑前两种可能*/ 	for(i=2;i<sizeof(a)/sizeof(int);i++) 	{ 		if(a[i]<min2) 		{ 			min2=a[i]; 		} 		if(min1>min2) 		{ 			t=min1; 			min1=min2; 			min2=t; 		} /*按逻辑应该是-----即按数轴方向、一段一段考查*/           if(a[i]<=min1)          { min2=min1;            min1=a[i];          }         else if(a[i] <min2)         { min2=a[i];        }                 	} 	printf("%d\n",min1); 	return 0; }  在linux mint gcc上编译通过 上面某楼的 min1=min2=a[0];的假定初值，当a[0]就是该数组的最小值时，就找不到次小的了

user: user-4
content: 一次扫描可以解决的问题 定义2个变量一个最小一个次小，分别给个很大的初始值  扫描，取出数Ai和次小比较，如果比次小大，则该数跳过 如果Ai比次小小，则Ai和最小比较，如果比最小小，则让次小=最小，最小=Ai，如果Ai比最小大，则，次小=Ai，最小不变；然后下一个，直到扫描完毕；要交换次小和最小，你们交换数据的时候，记得同时得交换序号

user: user-5
content: 冒个泡   自己想

user: user-6
content: 除了9楼、32楼和35楼 其他回答都很2B

user: user-7
content: 忘了输出min2了。。。 min1为最小值 min2为次最小值

user: user-7
content: 可以直接用一次循环 代码： #include <stdio.h>  int main() { 	int i; 	int t; 	int a[]={2,3,4,2,0,5,8,6,1,8,4,3,7}; 	int min1=a[0]; 	int min2=a[1]; 	if(min1>min2) 	{ 		t=min1; 		min1=min2; 		min2=t; 	} 	for(i=2;i<sizeof(a)/sizeof(int);i++) 	{ 		if(a[i]<min2) 		{ 			min2=a[i]; 		} 		if(min1>min2) 		{ 			t=min1; 			min1=min2; 			min2=t; 		} 	} 	printf("%d\n",min1); 	return 0; }  在linux mint gcc上编译通过

user: user-8
content: 引用 12 楼 zyaiwx 的回复: 定义两个变量 submin和min 都初始化为极小值(你产生的是正整数，那就用0就好了) 每次从数组里面取两个数a和b a和b进行比较， 选出大的和submin比， 选出小的和min比。我也想了这个办法，可如果是负整数怎么办？ 负整数和正整数都有怎么办？ 怎么取极小值?

user: user-8
content: 从大到小排序，不就可以了么？

user: user-9
content: 引用 12 楼 zyaiwx 的回复: 定义两个变量 submin和min 都初始化为极小值(你产生的是正整数，那就用0就好了) 每次从数组里面取两个数a和b a和b进行比较， 选出大的和submin比， 选出小的和min比。++++++这个方法比较好

user: user-10
content: 引用 15 楼 zhao4zhong1 的回复:怎么找出10个元素的值中只有两种时数组中的最小值和次小值？ 爱因斯坦好象说过：提出问题比解答问题更难！！！

user: user-11
content: 引用 14 楼 zhao4zhong1 的回复:怎么找一个空数组和只有一个元素的数组中的最小值和次小值？ 爱因斯坦好象说过：提出问题比解答问题更难！ 不找，直接说没有。 你这个太极端，其实一个元素的数组，怎么定义最小值和次小值更有意义。 哈哈！！！！！！！！！！

user: user-11
content: 这个方法似乎也可以用于选择问题

user: user-11
content: 可以这么做：  定义两个整数，作为下标，表示最小元，次小元位置。  任取两个位置作为最小元，次小元位置，比较数据元素大小，让第一个为最小，第二个为次小   其他数据，每个数，跟次小比较，不小则什么也不做，小则替换之， 然后比较最小次小，依然保持 第一个为最小，第二个为次小。  最后互换最小元，次小元位置。 PS： 过程中，始终保持第一个为最小，第二个为次小。 对于重复数据，你这问题里，没有定义，最小元和次小元是否相同， 所以无法确定，能否直接使用这个方法

user: user-12
content: # include <stdio.h> # include <stdlib.h>  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 < 10; i++)         a[i] = rand() % 100;     for (i = 0; i < 10; i++)         printf("%d\n", a[i]);      if (a[0] < a[1]) // assume a[0] is min, a[1] is second min         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 < 10; i++)     {         if (a[i] < *p) // less than min         {             q = p; // old min is new second min             p = a + i; // a[i] is new min         }         else if (a[i] < *q) // greater than min but less than second min         {             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 < 10; i++)         printf("%d\n", a[i]);      return 0; }

user: user-10
content: 怎么找出10个元素值都一样的数组中的最小值和次小值？ 爱因斯坦好象说过：提出问题比解答问题更难！！

user: user-10
content: 怎么找一个空数组和只有一个元素的数组中的最小值和次小值？ 爱因斯坦好象说过：提出问题比解答问题更难！

user: user-13
content: 循环两次就行了，第一次记录数组中最小值的角标，再来循环一次（跳过第一次记录的角标）记录最小值的角标就是次小的