Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Определить максимальный элемент массива


Автор: BftS 25.11.2009, 19:09
Как можно определить позицию максимального элемента массива? 
Элементы - целые числа, могут быть отрицательными.

Код

int getMaxElement(int M[], int N)
{
    int maxid=0;
    for(int i=0 ; i<N; i++)
    {
        if(M[i]>=M[maxid])maxid=i;
    }
    return maxid;
}

Как бы все просто. Но.
Если до этого максимально знаечение определялось, мы должны выбрать следующее за ним наибольшее значение
Т.е. если массив 0,1,2 , то в первый раз мы получаем 2, потом 1, а потом 0.
По идеи все тоже легко, просто добавить в if условие M[i]<LAST_MAX 
Но, как мы получим изначально LAST_MAX. Оно должно быть необычайно огромным, что бы не обрезать ни один элемент.

Вроде звучить легко, но добиться от себя решения не могу...

Автор: mes 25.11.2009, 19:40
Цитата(BftS @  25.11.2009,  18:09 Найти цитируемый пост)
Но, как мы получим изначально LAST_MAX. Оно должно быть необычайно огромным, что бы не обрезать ни один элемент.

гораздо проще - берите значение первого (с индексом 0) элемента...

 Только не забывайте перед началом проверить что массив не пустой, ну и придумать как вести себя в противной ситуации. smile

Автор: Abyx 25.11.2009, 19:41
Код

int getMaxElement(int M[], int N)
{
    int maxid=0;
    int max=INT_MIN;
    for(int i=0 ; i<N; ++i)
        if(M[i]>max)
        {
             maxid=i;
             max=M[i];
        }
    return maxid;
}

Автор: BftS 25.11.2009, 19:51
Цитата(mes @ 25.11.2009,  19:40)
Цитата(BftS @  25.11.2009,  18:09 Найти цитируемый пост)
Но, как мы получим изначально LAST_MAX. Оно должно быть необычайно огромным, что бы не обрезать ни один элемент.

гораздо проще - берите значение первого (с индексом 0) элемента...

 Только не забывайте перед началом проверить что массив не пустой, ну и придумать как вести себя в противной ситуации. smile

А что будет, если первый элемент больше третьего ? ))

Автор: Abyx 25.11.2009, 19:52
BftS, тогда он максимальный %)

Автор: powerfox 25.11.2009, 19:55
Цитата(Abyx @  25.11.2009,  20:41 Найти цитируемый пост)
    int max=INT_MIN;

Зачем лишняя переменная, если индекс и так сохраняем?

Автор: Abyx 25.11.2009, 19:58
powerfox, так оптимальнее.

Добавлено через 7 минут и 1 секунду
вообще, надо наверное написать как-то так

Код

int getMaxElement(int M[], int N)
{
    if( N==0 )
        return -1;

    int* pmax=M;
    int max=*pmax;
    for(int* it=M+1, e=M+N ; it<e; ++it)
        if( *it>max )
        {
             max=*it;
             pmax=it;
        }

    return pmax-M;
}


Добавлено через 11 минут и 37 секунд
Цитата(powerfox @  25.11.2009,  19:55 Найти цитируемый пост)
лишняя переменная

лишняя - в смысле объема исходного кода?

Автор: mes 25.11.2009, 20:12
Цитата(Abyx @  25.11.2009,  18:58 Найти цитируемый пост)
лишняя - в смысле объема исходного кода? 

нет..  в смысле ухудшения читабельности и нагружения логики..

Добавлено @ 20:15
Цитата(Abyx @  25.11.2009,  18:58 Найти цитируемый пост)
вообще, надо наверное написать как-то так


имхо, тогда надо довести идею с "итераторами" до  конца :
Код


int * max_in_range (int * begin, int * end)
{
     int * max = begin;
     for (int *p=begin; p != end; ++p)
            if (*p > *max) max = p;

     return max;
}

Автор: unicuum 27.11.2009, 12:06
Монстр какой-то получается smile да здравствует китайский код:

Код

#include <iostream>

using namespace std;

// Получить индекс с наибольшим значением
int getIndexMax(const int* const array, const unsigned int& size)
{
    unsigned int maxIndex;
    unsigned int index = 0;
    if (size > 0) maxIndex = index;
    else return -1;
    for(index = 1; index < size; index++)
        if (array[maxIndex] < array[index])
            maxIndex = index;
    return maxIndex;
}

void writeIndex(const int* const array, const unsigned int& size)
{
    cout << size << endl;
    cout << "Индекс с наибольшим значением: " << getIndexMax(array, size) << endl;
}

int main()
{
    int array0[] = {};
    int array1[] = {3};
    int array2[] = {7, 23};
    int array3[] = {15, 30, 70, 91};

    writeIndex(array0, sizeof(array0) / sizeof(int));
    writeIndex(array1, sizeof(array1) / sizeof(int));
    writeIndex(array2, sizeof(array2) / sizeof(int));
    writeIndex(array3, sizeof(array3) / sizeof(int));

    return 0;
}


Вывод:
Код

0
Индекс с наибольшим значением: -1
1
Индекс с наибольшим значением: 0
2
Индекс с наибольшим значением: 1
4
Индекс с наибольшим значением: 3


Автор: Earnest 27.11.2009, 18:55
Если нужно последовательно получать максимальные значения, еще не использовавшиеся, то не проще ли один раз отсортировать массив? Или отсортировать индексы, если трогать сам массив нельзя. Общая производительность будет выше (т.к. вместо последовательный линийных поисков мы можем один раз сделать квик-сорт и свести дело к N log N)? да и как-то элегантне это...

Добавлено через 1 минуту и 58 секунд
Кроме того, если нужно получить не весь ряд "максимальных" значений, а только какую-то часть, можно ипользовать partial_sort.

Автор: unicuum 28.11.2009, 00:00
Цитата(Earnest @  27.11.2009,  18:55 Найти цитируемый пост)
Если нужно последовательно получать максимальные значения, еще не использовавшиеся, то не проще ли один раз отсортировать массив? Или отсортировать индексы, если трогать сам массив нельзя

Для задачи автора топика так и надо делать. То есть задача сначала сформулирована в получении одного наибольшего элемента. Но внизу есть пояснение, что на самом деле надо получать индексы массива в порядке убывания значений на которые они ссылаются.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)