作者:独行小刀 | 来源:互联网 | 2023-05-18 15:20
从一个数组中找最大元素和最小元素,要求总比较次数小于2n-2,(注:n为数组长度)
19 个解决方案
int min,max;
min=s[0];
max=s[0];
for(i=1;i {
if(min if(max>s[i])max=s[i];
}
int MaxKey(int a[] ,int n)
{
int temp;
if ( n == 1)
return a[0];
temp = MaxKey(a,n-1);
if (temp > a[n-1])
return temp;
else
return a[n-1];
}
求最小数
int MinKey(int a[] ,int n)
{
int temp;
if ( n == 1)
return a[0];
temp = MinKey(a,n-1);
if (temp < a[n-1])
return temp;
else
return a[n-1];
}
int min,max;
min=s[0];
max=s[0];
for(i=1;i {
if(s[i] min=s[i];
else if(s[i]>max)
max=s[i];
}
int min1,min2,max1,max2;
min1 = s[0];
max1 = s[0];
min2 = s[n-1];
max2 = s[n-1];
int maxcount;
int min,max;
maxcount = (n%2==0?n/2:n/2+1);
for(i=1;i {
if(min1>s[i])
{
min1=s[i];max1=min1;
}
if(min2>s[n-1-i])
{
min2=s[n-1-i];
max2=min2;
}
}
min = (min1>=min2?min2:min1);
max = (max1<=max2?max2:max1);
所有楼上的都是大于等于2n-2次的!!
#include
using namespace std;
bool MinMax(int w[], int n, int& Min, int& Max)
{
if (n < 1) return false;
if (n == 1)
{
Min = Max = 0;
return true;
}
int s;
if (n % 2) {
Min = Max = 0;
s = 1;
}
else
{
if (w[0] > w[1])
{
Min = 1;
Max = 0;
}
else
{
Min = 0;
Max = 1;
}
s = 2;
}
for (int i = s; i < n; i += 2)
{
if (w[i] > w[i+1])
{
if (w[i] > w[Max]) Max = i;
if (w[i+1] < w[Min]) Min = i + 1;
}
else
{
if (w[i+1] > w[Max]) Max = i + 1;
if (w[i] < w[Min]) Min = i;
}
}
return true;
}
int main()
{
int w[10] = {414,24331,12334,54,532,5432,542352,4523452,234,245};
int max,min;
MinMax(w,10,min,max);
cout< return 0;
}
int min,max;
min=s[0];
max=s[0];
for(i=1;i {
if(min else if(max>s[i])max=s[i];
}
设两个单元分别保存当前最大,最小值,然后依次和数组中各元素比较,如果比当前最大还要大,那自然不用再跟当前最小的那各比较,对求最小值也同理,介于当前最大,最小值之间则要比较两次,不过总共比较次数肯定小于2(n-1)=2n-2次
UPCC(杂食动物):
如果是10个数,你的比较次数可能会达20次
if (n < 1) return false; 1次
if (n == 1) 1次
for (int i = s; i < n; i += 2) 5次
if (w[i] > w[i+1]) 5次
if (w[i] > w[Max]) Max = i; 5次
if (w[i+1] < w[Min]) Min = i + 1; 5次
这样的话你就有22次比较了
#include "stdio.h"
int main()
{
int s[15]= {123,324,235,3124,345,2134,43,123,512,12,12,34,12,445,14325};
int n=sizeof(s)/4;
printf("%d\n",n);
int min1,min2,max1,max2;
min1 = s[0];
max1 = s[0];
min2 = s[n-1];
max2 = s[n-1];
int maxcount;
int min,max;
maxcount = (n%2==0?n/2:n/2+1);
int i,j=0;
for(i=1;i {
if(min1>s[i])
{
min1=s[i];
j++;
}
else if(max1 {
max1=s[i];
j++;
}
if(min2>s[n-1-i])
{
min2=s[n-1-i];
j++;
}
else if(max2 {
max2=s[n-1-i];
j++;
}
}
min = (min1>=min2?min2:min1);
max = (max1<=max2?max2:max1);
printf("max:%d,min:%d\n",min,max);
printf("count:%d\n",j);
}
#include "stdio.h"
int main()
{
int s[16]= {123,324,235,3124,345,2134,43,123,512,12,12,34,12,445,14325,-12};
int n=sizeof(s)/4;
printf("%d\n",n);
int min1,min2,max1,max2;
min1 = s[0];
max1 = s[0];
min2 = s[n-1];
max2 = s[n-1];
int maxcount;
int min,max;
maxcount = (n%2==0?n/2:n/2+1);
int i,j=0;
for(i=1;i {
if(min1>s[i])
{
min1=s[i];
j++;
}
else if(max1 {
max1=s[i];
j+=2;
}
if(min2>s[n-1-i])
{
min2=s[n-1-i];
j++;
}
else if(max2 {
max2=s[n-1-i];
j+=2;
}
}
min = (min1>=min2?min2:min1);
max = (max1<=max2?max2:max1);
printf("max:%d,min:%d\n",max,min);
printf("count:%d\n",j);
}
设两个单元分别保存当前最大,最小值,然后依次和数组中各元素比较,如果比当前最大还要大,那自然不用再跟当前最小的那各比较,对求最小值也同理,介于当前最大,最小值之间则要比较两次,不过总共比较次数肯定小于2(n-1)=2n-2次
#include "stdio.h"
int main()
{
int s[16]= {123,324,235,3124,345,2134,43,123,512,12,12,34,12,445,14325,-12};
int n=sizeof(s)/4;
printf("%d\n",n);
int min1,min2,max1,max2;
min1 = s[0];
max1 = s[0];
min2 = s[n-1];
max2 = s[n-1];
int maxcount;
int min,max;
maxcount = (n%2==0?n/2:n/2+1);
int i,j=0;
for(i=1;i {
if(min1>s[i])
{
min1=s[i];
}
j++;
if(max1 {
max1=s[i];
}
j++;
if(min2>s[n-1-i])
{
min2=s[n-1-i];
}
j++;
if(max2 {
max2=s[n-1-i];
}
j++;
}
min = (min1>=min2?min2:min1);
max = (max1<=max2?max2:max1);
printf("max:%d,min:%d\n",max,min);
printf("count:%d\n",j);
}
1.
int s[n];
int min(0), max(1);
if(s[min]>s[max]) // 1 次
{
min=1; max=0;
}
for(int i=2; i {
if(s[i]>s[max]) max=i;
else
if(s[i] }
输出min, max
总次数不超过 1+2(n-2) = 2n-3 < 2n-2
平均次数为 1+1.5*(n-2)= 1.5n-2
注:没有加上对n值是否>1的判断
2.
求最大值和最小值的算法比较次数证明:
1.求一个数组的最大值,比较次数为n-1
2.从剩下的元素中找最小值,比较次数为n-2,
这个值(n-2)不能够再小,
这是因为,我们不能够对前面求得最大值的结果加以利用,
所有剩下的值都不超过最大值
故算法比较次数为(n-1)+(n-2)=2n-3
3.特殊情况下,比较次数可以达到n-1,
这种情况就是这个数组本身就有序(从大到小、或相反)
n个元素的数组,单一的找最大或者最小,都需要n-1次比较
如果独立找两次,总需要比较量就是2n-2次
如果只是达到比这个数目小的目的,很简单,只要那里节约下一次比较就可以了
假定,比较到某个数据的时候,当前的最大和最小数据是max和min
把当前数据和min比较,如果它比min小,自然就不要和max比较了
如果它比max大自然也不用和min比较了
而这样的数肯定是存在的,因此小于2n-2的算法没有什么讨论价值
以前在算法和数据结构当中讨论过小于3/2 ×N -2的算法
原理如下
abcd四个数比较的时候,两两分组,找出各自的大的和小的,需要2次比较
然后大的和大的比较,找到最大,小的和小的比较找到最小
一共是4次比较,找到了最大和最小
对于N个数据的时候,把他们分成N/4个组,每组用4次比较找到其中的最大和最小
总共用了N次比较
把N/4个组内最大的数据之间进行比较找到最大的,需要N/4-1次比较
在N/4个组内最小的数据之间进行比较找到最小的,也需要N/4-1次比较
这样,找到了N个数据当中最大和最小的数据,需要的总比较次数就是
N + N/4 -1 + N/4 - 1 = 3 / 2 * N - 2次
#include "stdafx.h"
#include "stdio.h"
int main()
{
int s[15]= {123,324,235,123123123,345,2134,43,123,12312323,12,12,34,12,14325,-12};
int n=sizeof(s)/4;
printf("%d\n",n);
int min1,min2,max1,max2;
min1 = s[0];
max1 = s[0];
min2 = s[n-1];
max2 = s[n-1];
int maxcount;
int min,max;
maxcount = n/2;//==0?n/2:n/2);
printf("%d\n",maxcount);
int i,j=0;
for(i=1;i {
if(min1>s[i])
{
min1=s[i];
}
j++;
if(max1 {
max1=s[i];
}
j++;
}
maxcount=n-maxcount;
for(i=1;i {
if(min2>s[n-1-i])
{
min2=s[n-1-i];
}
j++;
if(max2 {
max2=s[n-1-i];
}
j++;
}
min = (min1>=min2?min2:min1);
max = (max1<=max2?max2:max1);
printf("max:%d,min:%d\n",max,min);
printf("count:%d\n",j);
}
ringking007(四叶clover) ( ) 信誉:100 2005-03-04 15:50:00 得分: 0
int min,max;
min=s[0];
max=s[0];
for(i=1;i {
if(min if(max>s[i])max=s[i];
}
回复人: jialuo(jialuo) ( ) 信誉:100 2005-03-04 17:07:00 得分: 0
UPCC(杂食动物):
如果是10个数,你的比较次数可能会达20次
if (n < 1) return false; 1次
if (n == 1) 1次
for (int i = s; i < n; i += 2) 5次 //这5次应该算吗???????
if (w[i] > w[i+1]) 5次
if (w[i] > w[Max]) Max = i; 5次
if (w[i+1] < w[Min]) Min = i + 1; 5次
这样的话你就有22次比较了 (是不是22 - 5 = 17次???)