| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 8130 人关注过本帖
标题:[代码贴]在一个数组中寻找最大值和最小值所需要进行比较的次数
只看楼主 加入收藏
八画小子
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:贵宾
威 望:37
帖 子:709
专家分:2063
注 册:2010-11-11
结帖率:96.55%
收藏
 问题点数:0 回复次数:27 
[代码贴]在一个数组中寻找最大值和最小值所需要进行比较的次数
数组大小为ArraySize,若ArraySize为偶数,则需要(n-2)/2×3+1次比较;若ArraySize位奇数,则需要(n-1)/2×3次比较。以两个数为一组,首先比较这两个的大小,然后分别与当前最小值和最大值比较。
程序代码:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define MIN(a, b) ((a) < (b) ? (a) : (b))
#define MAX(a, b) ((a) > (b) ? (a) : (b))

#define GetMinAndMax(a, b, minimum, maximum, times) \
({ \
    unsigned int arg1 = (a); \
    unsigned int arg2 = (b); \
    (minimum) = MIN(arg1, arg2); \
    (maximum) = MAX(arg1, arg2); \
    (times)++; \
    printf("time %3d: Compared %3d and %3d\n", times, arg1, arg2); \
})

#define ARRAY_SIZE    99
static int _Array[ARRAY_SIZE];

static void InitArray(void)
{
    srand((unsigned int)time(NULL));
    for(int i = 0; i < ARRAY_SIZE; i++)
        _Array[i] = rand() % (ARRAY_SIZE * 10);
   

    return;
}

static void PrintArray(void)
{
    for(int i = 0; i < ARRAY_SIZE; i += 5)
    {
        printf("%d\t%d\t%d\t%d\t%d\n",
            _Array[i], _Array[i + 1], _Array[i + 2], _Array[i + 3], _Array[i + 4]);
    }
   

    return;
}

static void Findminimum(void)
{
    unsigned int times = 0;
    int minimum;
    int maximum;
    int beginIndex;
    int tempMinimum;
    int tempMaximum;
   

    if(ARRAY_SIZE % 2 == 0)
    {
        GetMinAndMax(_Array[0], _Array[1], minimum, maximum, times);
        beginIndex = 2;
    }
    else
    {
        minimum = maximum = _Array[0];
        beginIndex = 1;
    }
   

    for(int i = beginIndex; i < ARRAY_SIZE; i += 2)
    {
        GetMinAndMax(_Array[i], _Array[i + 1], tempMinimum, tempMaximum, times);
        GetMinAndMax(minimum, tempMinimum, minimum, tempMinimum, times);
        GetMinAndMax(tempMaximum, maximum, tempMaximum, maximum, times);
    }
    printf("Has compared %d times, and minimum is %d, maximum is %d\n", times, minimum, maximum);
}

int main(int argc, char * argv[])
{
    InitArray();
    PrintArray();
    Findminimum();
   

    return EXIT_SUCCESS;
}
代码中GetMinAndMax宏的定义采用了gcc编译器的特性,如果在非gcc编译器上编译,很有可能出错,可以把它改写成等效的函数,在此就不该代码了。


[此贴子已经被作者于2017-7-13 17:24编辑过]

搜索更多相关主题的帖子: 代码 比较 times int void 
2017-07-13 17:23
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
好像这个方法适用于任何排序类型的样子~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-07-13 17:56
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
回复 4楼 renkejun1942
typeof是C99的?~或许可以把数据类型也写入宏参数里面~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-07-13 18:38
八画小子
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:贵宾
威 望:37
帖 子:709
专家分:2063
注 册:2010-11-11
收藏
得分:0 
1、for(int i = 0; i < ARRAY_SIZE; i += 5)这种处理是为了能够在处理海量数据时降低循环次数,提升性能。如果你真的把数组大小设置成一个很小的数据,那就没有太大意义了。
2、请看清楚,分情况讨论的。
3、在没必要的地方讨论一些没意义的问题,属于钻牛角尖。
4、typeof是C++的东西,不是C语言的范畴


[此贴子已经被作者于2017-7-13 18:45编辑过]

2017-07-13 18:43
八画小子
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:贵宾
威 望:37
帖 子:709
专家分:2063
注 册:2010-11-11
收藏
得分:0 
随手写的一段代码而已,如果觉得我写得代码不完善,大家完全可以自己完善后完整代码贴出来。至于renkejun1942的更正,如果不客气的说,就是错误代码。
2017-07-13 18:49
八画小子
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:贵宾
威 望:37
帖 子:709
专家分:2063
注 册:2010-11-11
收藏
得分:0 
以下是引用renkejun1942在2017-7-13 18:46:18的发言:

呵呵。。typeof是C++的关键字?你也是逗。

你可以用typeof作为关键词分别搜索一下C标准和C++标准就知道谁逗了
2017-07-13 18:51
八画小子
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:贵宾
威 望:37
帖 子:709
专家分:2063
注 册:2010-11-11
收藏
得分:0 
以下是引用renkejun1942在2017-7-13 18:50:13的发言:

你认为那是错的就是错的吧。
 
你说你用gcc,拿去编译下。

下面是GCC编译你的代码后的错误信息:
程序代码:
cc -std=c11 main.c -o main
main.c: In function ‘Findminimum’:
main.c:10:2: warning: implicit declaration of function ‘typeof’ [-Wimplicit-function-declaration]
  typeof(a) arg1 = (a); \
  ^
main.c:52:3: note: in expansion of macro ‘GetMinAndMax’
   GetMinAndMax(_Array[0], _Array[1], minimum, maximum, times);
   ^
main.c:10:12: error: expected ‘;’ before ‘arg1’
  typeof(a) arg1 = (a); \
            ^
main.c:52:3: note: in expansion of macro ‘GetMinAndMax’
   GetMinAndMax(_Array[0], _Array[1], minimum, maximum, times);
   ^
main.c:11:12: error: expected ‘;’ before ‘arg2’
  typeof(b) arg2 = (b); \
            ^
main.c:52:3: note: in expansion of macro ‘GetMinAndMax’
   GetMinAndMax(_Array[0], _Array[1], minimum, maximum, times);
   ^
main.c:12:18: error: ‘arg1’ undeclared (first use in this function)
  (minimum) = MIN(arg1, arg2); \
                  ^
main.c:5:21: note: in definition of macro ‘MIN’

 #define MIN(a, b) ((a) < (b) ? (a) : (b))
                     ^
main.c:52:3: note: in expansion of macro ‘GetMinAndMax’
   GetMinAndMax(_Array[0], _Array[1], minimum, maximum, times);
   ^
main.c:12:18: note: each undeclared identifier is reported only once for each function it appears in
  (minimum) = MIN(arg1, arg2); \
                  ^
main.c:5:21: note: in definition of macro ‘MIN’

 #define MIN(a, b) ((a) < (b) ? (a) : (b))
                     ^
main.c:52:3: note: in expansion of macro ‘GetMinAndMax’
   GetMinAndMax(_Array[0], _Array[1], minimum, maximum, times);
   ^
main.c:12:24: error: ‘arg2’ undeclared (first use in this function)
  (minimum) = MIN(arg1, arg2); \
                        ^
main.c:5:27: note: in definition of macro ‘MIN’

 #define MIN(a, b) ((a) < (b) ? (a) : (b))
                           ^
main.c:52:3: note: in expansion of macro ‘GetMinAndMax’
   GetMinAndMax(_Array[0], _Array[1], minimum, maximum, times);
   ^
main.c:10:12: error: expected ‘;’ before ‘arg1’
  typeof(a) arg1 = (a); \
            ^
main.c:63:3: note: in expansion of macro ‘GetMinAndMax’
   GetMinAndMax(_Array[i], _Array[i + 1], tempMinimum, tempMaximum, times);
   ^
main.c:11:12: error: expected ‘;’ before ‘arg2’
  typeof(b) arg2 = (b); \
            ^
main.c:63:3: note: in expansion of macro ‘GetMinAndMax’
   GetMinAndMax(_Array[i], _Array[i + 1], tempMinimum, tempMaximum, times);
   ^
main.c:10:12: error: expected ‘;’ before ‘arg1’
  typeof(a) arg1 = (a); \
            ^
main.c:64:3: note: in expansion of macro ‘GetMinAndMax’
   GetMinAndMax(minimum, tempMinimum, minimum, tempMinimum, times);
   ^
main.c:11:12: error: expected ‘;’ before ‘arg2’
  typeof(b) arg2 = (b); \
            ^
main.c:64:3: note: in expansion of macro ‘GetMinAndMax’
   GetMinAndMax(minimum, tempMinimum, minimum, tempMinimum, times);
   ^
main.c:10:12: error: expected ‘;’ before ‘arg1’
  typeof(a) arg1 = (a); \
            ^
main.c:65:3: note: in expansion of macro ‘GetMinAndMax’
   GetMinAndMax(tempMaximum, maximum, tempMaximum, maximum, times);
   ^
main.c:11:12: error: expected ‘;’ before ‘arg2’
  typeof(b) arg2 = (b); \
            ^
main.c:65:3: note: in expansion of macro ‘GetMinAndMax’
   GetMinAndMax(tempMaximum, maximum, tempMaximum, maximum, times);
   ^
Makefile:4: recipe for target 'main' failed
make: *** [main] Error 1

2017-07-13 18:54
八画小子
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:贵宾
威 望:37
帖 子:709
专家分:2063
注 册:2010-11-11
收藏
得分:0 
以下是引用renkejun1942在2017-7-13 18:54:32的发言:

不到黄河心不死,送给你,你要还坚持,那当我什么都没说。
 
另外,如果你分不清楚C和C++源文件后缀的区别的话,那当我什么都没说。
 
"另外,如果你分不清楚C和C++源文件后缀的区别的话,那当我什么都没说。"
..................
..................
..................
2017-07-13 18:58
八画小子
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:贵宾
威 望:37
帖 子:709
专家分:2063
注 册:2010-11-11
收藏
得分:0 
以下是引用renkejun1942在2017-7-13 18:56:02的发言:

用不了typeof,那试试 __typeof__
 
我不知道你为什么编译的命令会是 cc,但是typeof本来就是gcc的扩展。
"我不知道你为什么编译的命令会是 cc"
--井底之蛙永远也不知道天空到底有多大。
2017-07-13 19:01
八画小子
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:贵宾
威 望:37
帖 子:709
专家分:2063
注 册:2010-11-11
收藏
得分:0 
以下是引用renkejun1942在2017-7-13 19:02:12的发言:

嗯……我井底之蛙。

既然你还能认识到这一点,我就告诉你为什么你写的个错误代码能编译通过:gcc默认遵从的是GCC的C语言扩展标准,貌似当前最新版本遵从的是gnu11。如果要你的代码能够到处都能够编译,就只能遵从C标准而非GCC扩展标准。如果非用不可,也要单独提出说明一下。
2017-07-13 19:10
快速回复:[代码贴]在一个数组中寻找最大值和最小值所需要进行比较的次数
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.033398 second(s), 10 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved