Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.64/47: Рейтинг темы: голосов - 47, средняя оценка - 4.64
0 / 0 / 0
Регистрация: 26.08.2018
Сообщений: 6

Поиск N-ого количества максимальных значений в массиве

26.08.2018, 05:06. Показов 9822. Ответов 15

Студворк — интернет-сервис помощи студентам
Дан массив из N элементов заполненный случайным образом.Необходимо найти и вывести на экран K максимальных значений.Способ отсортировать массив и вывести К последних элементов не хочу,уж слишком тривиально.Подскажите как делать.

Добавлено через 1 час 4 минуты
Все.Тема закрыта.Придумал и написал решение.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
void search_k_max(int arr[], int size, int k) {
    int max = arr[0];//Переменная для поиска максимального элемента
    int count = 0;//Счетчик элемента
    for (int i = 0; i < size; i++) {//Поиск максимального элемента
        if (arr[i] > max)
            max = arr[i];
    }
    for (int i = 0; i < size&&count < k; i++) {//Поиск и вывод на экран всех максимальных значений K раз
        if (arr[i] == max) {
            cout << arr[i] << ' ';
            count++;
        }
 
    }
    if (count < k) {//Если максимальных значений меньше чем K
        while (count < k) {
            max--;//Следующее максимальное значение,меньше предыдущего на 1
            for (int i = 0; i < size&&count < k; i++)
                if (arr[i] == max) {
                    cout << arr[i] << ' ';
                    count++;
                }
        }
    }
    cout << endl;
}
Может кому пригодиться
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
26.08.2018, 05:06
Ответы с готовыми решениями:

Поиск заданного количества наименьших значений в массиве
В данной программе необходимо найти количество наименьших значений using System; using System.Collections.Generic; using System.Linq;...

Определение количества максимальных значений.
Помогите переделать. На экране в форме вводятся 3 вещественных числа. Здесь три числа складываются, а нам нужно определить количество...

Напишите функцию поиска количества максимальных элементов в массиве
напишите функцию поиска количества максимальных элементов в массиве (в С++)

15
Заблокирован
26.08.2018, 10:04
Твое решение очень неэффективное. Очень.
0
0 / 0 / 0
Регистрация: 26.08.2018
Сообщений: 6
26.08.2018, 13:44  [ТС]
mizannny, Попробуй предложи эффективнее.Написать «Твой вариант не эффективен»Может каждый,а предложи своё решение

Добавлено через 4 минуты
И что-бы тебе было веселее писать эффективное решение,аппелируй тем что дали мне.Статичный,одномерный массив,циклы и все ну и иф
0
1394 / 1023 / 325
Регистрация: 28.07.2012
Сообщений: 2,813
26.08.2018, 14:27
Softy, посмотри в сторону частичных сортировок. В частности в стандарте (C++17) есть функция std::nth_element, можешь изучить, как она устроена.
0
Неэпический
 Аватар для Croessmah
18146 / 10730 / 2066
Регистрация: 27.09.2012
Сообщений: 27,029
Записей в блоге: 1
26.08.2018, 15:34

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
//g++  5.4.0
 
#include <iostream>
#include <vector>
#include <algorithm>
#include <numeric>
 
template<typename ForwardIterator>
std::vector<ForwardIterator> max_n(ForwardIterator begin, ForwardIterator end, size_t count)
{
    std::vector<ForwardIterator> result;
    if (count == 0 || begin == end) {
        return result;
    }
    size_t st_count = std::min<size_t>(std::distance(begin, end), count);
    result.reserve(st_count + 1);
    ForwardIterator current = begin;
    std::advance(current, st_count);
    result.resize(st_count);
    std::iota(result.begin(), result.end(), begin);
    auto cmp = [](auto f, auto s) { return *f > *s; };
    std::sort(result.begin(), result.end(), cmp);
    if (st_count != count) {
        return result;
    }
    for (; current != end; ++current) {
        if (*current > *result.back()) {
            auto lbound = std::lower_bound(result.begin(), result.end(), current, cmp);
            result.insert(lbound, current);
            result.pop_back();
        }
    }
    return result;
}
 
 
int main()
{
    int arr[] = {9, 1, 4, 5, 2, 8, 3, 7, 8, 3, 7, 4, 5, 8, 6};
    for (auto e: max_n(arr, arr + sizeof(arr) / sizeof(*arr), 8)) {
        std::cout << *e << ' ';
    }
}
http://rextester.com/HVAK3094
1
677 / 479 / 216
Регистрация: 06.09.2013
Сообщений: 1,312
26.08.2018, 15:44
Softy,
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <iostream>
#include <iterator>
 
void search_k_max(int *arr, int size, int *dst, int k){
    dst[0] = arr[0];
    int m = 1;
    for(int i = 1; i < size; i++) {
        int j = m;
        while(j > 0 && dst[j - 1] < arr[i]) {
            if(j < m) dst[j] = dst[j - 1];
            j--;
        }
        if(j < m || m < k) dst[j] = arr[i];
        if(m < k) m++;
    }
}
 
int main()
{
    int a[] = {146, 27, 15, 3, 7, 82, 9, 32, 5, 12};
    int a_size = sizeof(a) / sizeof(int);
    int b[] = {0, 0, 0 };
    int b_size = sizeof(b) / sizeof(int);
    search_k_max(a, a_size, b, b_size);
    std::copy(b, b + b_size, std::ostream_iterator<int>(std::cout, " "));
    return 0;
}
1
710 / 356 / 104
Регистрация: 09.02.2018
Сообщений: 805
26.08.2018, 18:20
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
//Запись k наибольших элементов массива arr размером size в массив dst.
void search_k_max(int *arr, int size, int *dst, int k){
    dst[0] = arr[0]; //Берем 0-ой элемент массива arr в массив dst.
    int j, m = 1;
    //Для элементов массива arr с индексами от 1 до size-1...
    for(int i = 1; i < size; i++) {
        //Проходим по позициям массива dst с индексами от m до 0 и ищем позицию,
        //куда можно вставить i-й элемент массива arr так, чтобы он был
        //больше следующего за ним элемента массива dst. Если наименьший
        //элемент массива dst больше или равен i-му элемент массива arr,
        //то i-й элемент массива arr вставляется в конец массива dst.
        for(j = m; j > 0; j--) {
            if(dst[j - 1] >= arr[i]) break;
            //Если i-й элемент массива arr вставляется не в конец массива dst,
            //а в начало или середину массива, то сдвигаем элементы массива dst так,
            //чтобы i-й элемент массива arr можно было вставить на выбранную позицию.
            if(j < m) dst[j] = dst[j - 1];
        }
        //Если найдена позиция для вставки i-го элемента массива arr внутрь
        //или в начало массива dst, вставляем этот элемент. Иначе добавляем
        //i элемент массива arr в конец массива dst, если в нем еще есть свободные
        //места.
        if(j < m || m < k) dst[j] = arr[i];
        //Если количество занятых мест еще не равно максимальному размеру массива,
        //увеличиваем счетчик количества занятых мест.
        if(m < k) m++;
    }
}
woldemas, комменты верны??
0
677 / 479 / 216
Регистрация: 06.09.2013
Сообщений: 1,312
26.08.2018, 18:40
КулХацкеръ, да вроде, в общем и целом
0
0 / 0 / 0
Регистрация: 26.08.2018
Сообщений: 6
26.08.2018, 19:12  [ТС]
И вот опять.Вы все молодцы но повторю для тех кто в танке.Необходимо вывести на экран все максимальные положительные числа.Из инструментов можно использовать
1)Массив как он есть(без создания дополнительных)
2)Любые циклы
3)Библиотеку iostream (другие библиотеки не подключаем)

Так-то и я думал с вектором или дополнительным динамическим массивом,но увы и ах.
0
Заблокирован
26.08.2018, 20:24
Цитата Сообщение от Softy Посмотреть сообщение
Попробуй предложи эффективнее
Чего тут предлагать. Банальная сортировка и вывод. По каким причинам ты не хочешь использовать эффективное и просто решение меня не волнует.
0
Неэпический
 Аватар для Croessmah
18146 / 10730 / 2066
Регистрация: 27.09.2012
Сообщений: 27,029
Записей в блоге: 1
26.08.2018, 20:27
Цитата Сообщение от Softy Посмотреть сообщение
но повторю для тех кто в танке
Для тех кто в танке. Вам никто ничего не обязан. Люди выкладывают свои решения. Хотите, переделайте под свои требования, если Вас не устраивают представленные. К слову, все представленные решения без проблем могут быть изменены под заданные требования.
0
 Аватар для oxotnik
1665 / 1134 / 80
Регистрация: 21.08.2008
Сообщений: 4,734
Записей в блоге: 1
26.08.2018, 20:35
Цитата Сообщение от Softy Посмотреть сообщение
вывести на экран K максимальных значений
Цитата Сообщение от Softy Посмотреть сообщение
Необходимо вывести на экран все максимальные положительные числа
Вы путаетесь в показаниях. Отрицательные числа тоже могут подлежать сравнению друг с другом.
PS: в условие не указан порядок, в котором надо возвращать найденные числа.
0
677 / 479 / 216
Регистрация: 06.09.2013
Сообщений: 1,312
27.08.2018, 06:30
Цитата Сообщение от Softy Посмотреть сообщение
Так-то и я думал с вектором или дополнительным динамическим массивом,но увы и ах.
Вам в любом случае надо запоминать найденные максимумы, для этого необходимо либо использовать дополнительный массив, либо изменять исходный. Самый выгодный путь - сортировка, если вы ее не хотите использовать и не хотите использовать дополнительный массив - проведите "частичную" сортировку, тем же пузырьком, который на первом курсе изучают. За k итераций вы получите в конце исходного массива k максимумов.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
 
void search_k_max(int *arr, int size, int k){
    for(int i = 0; i < k; i++)
        for(int j = 0; j < size - i - 1; j++)
            if(arr[j] > arr[j + 1]) std::swap(arr[j], arr[j + 1]);
}
 
int main()
{
    int a[] = {146, 27, 15, 3, 7, 82, 9, 32, 5, 12};
    int a_size = sizeof(a) / sizeof(int);
    int k = 3;
    search_k_max(a, a_size, k);
    for(int i = a_size - k; i < a_size; i++)
        std::cout << a[i] << " ";
    return 0;
}
0
0 / 0 / 0
Регистрация: 26.08.2018
Сообщений: 6
27.08.2018, 16:23  [ТС]
woldemas,
Зачем?Функция является продцедурой.Нам необходимо просто вывести на экран с начала наибольшее значении Н раз,затем следующее за ним и так пока счётчик Н не будет равен введённому значению.Тоесть если в массиве числа
9,8,7,9,4,6,8,9,1,0,2,5,3,7
И юзер вводит скажем 6
Вывести на экран
9,9,9,8,8,7
На этом программа завершиться

Добавлено через 3 минуты
Ааа....я понял....тут основная масса тех кто мейн интом обзывают.Вопрос.Зачем?
0
677 / 479 / 216
Регистрация: 06.09.2013
Сообщений: 1,312
27.08.2018, 16:39
Softy, это вы про ваш код в первом посте? а понятие эффективности вам не знакомо?
сколько будет работать ваш алгоритм на массиве {100000000, 5, 4, 3, 2, 1}, если надо найти два максимума?
То что я написал выполнит 11 сравнений, а ваш алгоритм - 100 миллионов.
0
 Аватар для Новичок
1682 / 1098 / 489
Регистрация: 17.07.2012
Сообщений: 5,360
27.08.2018, 16:45
Цитата Сообщение от mizannny Посмотреть сообщение
Твое решение очень неэффективное. Очень.
Согласен. Даже квадратичная сортировка(пузырек, выбором, вставками) эффективна по сравнению с таким решением. Лучшее решение это std::partial_sort. Написать его самому не проблема при желании.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
27.08.2018, 16:45
Помогаю со студенческими работами здесь

Поиск максимального элемента массива, количества максимальных и их индексов
Ребят, выручайте! Есть одномерный массив Х = 10, 8, 5, 10, 6, 8, 10, 10. Надо нарисовать блок схему поиска максимально элемента в этом...

Блок схема к исходнику определения значения и количества максимальных элементов в массиве
Условие: Определить значения и количество максимальных элементов в массиве, и их среднее арифметическое. Код: #include...

Поиск максимальных и минимальных значений
Добрый день! Прошу помочь с решением поставленной жене задачки!

Вывод номеров всех максимальных значений в массиве
нужно выводить не номер одного, а всех максимальных элементов в массиве, то есть если в массиве есть максимальный элемент 3, и 3 находится...

Поиск максимальных значений по заданным критериям
Здравствуйте! Помогите найти несколько максимальных значений в определенном столбце массива для неизвестного количества строк, при этом...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru