商务合作加Q:411239339

找出数组中的最值,去除重复元素

浏览:890次阅读
一条评论

共计 847 个字符,预计需要花费 3 分钟才能阅读完成。

 在下面的数组中找出数组的最值(最大值和最小值)
int array[10] = {2, 3, 1, 4, 9, 8, 5, 10, 7, 6};

当时我的想法是数组中每个元素肯定是要遍历的,因为要有最大值和最小值寻找,所以要有 2n 次的比较,当时就在想是不是要在如何比较两个的大小上面做优化(当时有点脑抽筋,想到以前见过的不用 if,?:,switch 来比较两个数的大小 int array[2] = {a, b}, int max = array[a

回来上网查了下,原来是要减少比较的次数,将原来数组中两个数比较最大值和最小值进行的 4 次比较减少为 3 次, 这样比较次数就变为 3n/ 2 了,下面是算法实现

#include 

int main(int argc, char *argv[])
{int array[] = {2, 3, 1, 4, 9, 8, 5, 10, 7, 6};
    int len = sizeof(array) / sizeof(*array);
    int max = array[0];
    int min = array[0];
    int i, tmax, tmin, district;
    // 判断数组长度的奇偶性
    if (len % 2 == 0)
    {district = len;} else 
    {district = len - 1;}
    // 每次取出 2 个数进行 3 次比较,而不是每次取出 1 个数进行 2 次比较
    for(i=0; i tmin)
        {min = tmin;}
    }
    // 考虑到如果是奇数,最后一个数还有比较
    if (district == len - 1)
    {if (array[district] > max)
        {max = array[district];
        } 

        if (array[district] 

还有个题目是去除一个数组中的重复元素,列如下面的数组得到

array[10] = {2, 3, 1, 2, 1, 1, 4, 4, 5, 1};
// 得到这样的结果
array = {2, 3, 1, 4, 5}

我在写的时候我用的是统计法,先找出数组中的最大数,然后用这个最大数来申请一个新的空间 (时间复杂度是 n)。考官说我的算法浪费空间,而且非整数不可用,这里我就不写我的实现了,写一个我回来写的实现

#include 
#include 

/* 表示数组这个数有重复存在 */
#define  EXIST 2147483647

int main(int argc, char *argv[])
{int array[] = {2, 3, 1, 2, 1, 1, 4, 4, 5, 1};
    int len = sizeof(array) / sizeof(*array);
    int i, j;

    for (i = 0; i < len; ++i)
    {for (j = i + 1; j < len; ++j)
        {
            /* 当数组后面的元素和前面元素有重复时 */
            if (array[j] != EXIST && array[i] == array[j] )
            {array[j] = EXIST;
            }
        }
    }

    for (i = 0; i < len; ++i)
    {if(array[i] != EXIST)
            printf("%d", array[i]);
    }

    return 0;
}

 

正文完
扫码赞助
post-qrcode
 0
lslzhang
版权声明:本站原创文章,由 lslzhang 于2014-05-20发表,共计847字。
转载说明:除特殊说明外本站文章皆由果较瘦原创发布,转载请注明出处。
评论(一条评论)