zoukankan      html  css  js  c++  java
  • 如何寻找数组中的最小值和最大值

        方法一:老盆友快速排序法,代码如下:

    #include "stdafx.h"
    #include <stdio.h>
    #include <stdlib.h>
    int int_cmp(const void *a, const void *b)
    {
        const int *ia = (const int *)a;
        const int *ib = (const int *)b;
        return *ia - *ib;
    }
    void Unique_QuickSortMethod(int *arr, int elements)
    {
        //C语言自带的排序函数
        qsort(arr, elements, sizeof(int), int_cmp);
        printf("%d
    ", arr[0]);
        printf("%d
    ", arr[elements - 1]);
    }
    int main()
    {
        int array[5] = { 1, 2, 5, 4, 2 };
        int len = sizeof(array) / sizeof(array[0]);
        Unique_QuickSortMethod(array,len);
        getchar();
        printf("
    ");
    }

        方法二:取双元素法。维持两个变量min和max,min标记最小值,max标记最大值,初始值均设为数组首元素。从数组中第二个元素开始,每次比较相邻两个数,这样只用循环N/2次。较大者与max比较,较小者与min比较,找出最大值和最小值。比较次数为N/2*3=1.5N次。

        代码如下:

    #include "stdafx.h"
    #include <stdio.h>
    void GetMaxAndMin(int* arr, int len, int& Max, int& Min)
    {
        Max = arr[0];
        Min = arr[0];
        for (int i = 1; i < len - 1; i = i + 2)
        {
            if (arr[i] == arr[i + 1])
            {
                if (arr[i]>Max)
                    Max = arr[i];
                if (arr[i] < Min)
                    Min = arr[i];
            }
            if (arr[i]>arr[i + 1])
            {
                if (arr[i] > Max)
                    Max = arr[i];
                if (arr[i + 1] < Min)
                    Min = arr[i + 1];
            }
            if (arr[i] < arr[i + 1])
            {
                if (arr[i + 1]>Max)
                    Max = arr[i + 1];
                if (arr[i] < Min)
                    Min = arr[i];
            }
        }
    }
    int main()
    {
        int max, min;
        int data[] = {10,11, 5, 2, 3, 9, 4, 1, 7 };
        int num = sizeof(data) / sizeof(data[0]);
        GetMaxAndMin(data, num, max, min);
        printf("Max:%d
    ", max);
        printf("Min:%d
    ", min);
        getchar();
        return 0;
    }

        效果如图:

        方法三:分治法。其实它娘的就是迭代,将数组划分成两半,分别找出两边的最小值、最大值,则最小值、最大值分别是两边最小值的较小者、两边最大值的较大者。

        代码如下:

    #include "stdafx.h"
    #include <stdio.h>
    void GetMaxMin(int a[], int low, int high, int& max, int& min)
    {
        int k, max1, min1, max2, min2;
        if (high - low == 1 || high - low == 0)
        {
            a[low] > a[high] ? (max = a[low], min = a[high]) : (max = a[high], min = a[low]);
        }
        else
        {
            k = (high + low) / 2;
            GetMaxMin(a, low, k, max1, min1);
            GetMaxMin(a, k + 1, high, max2, min2);
            max = max1 > max2 ? max1 : max2;
            min = min1 < min2 ? min1 : min2;
        }
    }
    int main()
    {
        int max, min;
        int data[] = { 8, 6, 5, 2, 3, 9, 4, 1, 7 };
        int num = sizeof(data) / sizeof(data[0]);
        GetMaxMin(data, 0, num - 1, max, min);
        printf("Max:%d
    ", max);
        printf("Min:%d
    ", min);
        getchar();
        return 0;
    }

        效果如图:

  • 相关阅读:
    C语言头文件stdarg.h(cstdarg)
    C语言头文件ctype.h(cctype)
    内存数库库种类
    C#设计模式单件模式(Singleton Pattern)
    vs2005快捷键,vs2008通用
    移动MYSQL数据库经常遇到乱码的问题
    ie6 ie7 ie8 共存以及Firefox浏览器CSS兼容写法
    用正则表达式替换a标记href值
    IE6 PNG透明终极解决方案(打造W3CfunsIE6PNG最强帖)
    IE的hack
  • 原文地址:https://www.cnblogs.com/cysolo/p/3597964.html
Copyright © 2011-2022 走看看