Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.73/96: Рейтинг темы: голосов - 96, средняя оценка - 4.73
2 / 2 / 3
Регистрация: 05.10.2014
Сообщений: 209

Как найти медиану неотсортированного массива (без использования дополнительного массива)

29.12.2014, 23:59. Показов 21091. Ответов 30
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
как найти медиану неотсортированного массива, при этом не используя дополнительных массивов и не сортируя его.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
29.12.2014, 23:59
Ответы с готовыми решениями:

Осуществить перестановку элементов одномерного массива без использования дополнительного массива
Написать программу, которая осуществляет перестановку элементов одномерного массива (заполненный случайными числами в диапазоне от -5 до...

Переставить элементы заданного массива в обратном порядке без использования дополнительного массива
Напишите программу, которая переставляет элементы массива в обратном порядке без использования дополнительного массива. Программа должна...

Переписать элементы массива в обратном порядке без использования дополнительного массива
Здравствуйте, была бы очень благодарна если поможете :) 1. Дан одномерный массив. Переписать его элементы в обратном порядке без...

30
221 / 166 / 47
Регистрация: 17.07.2012
Сообщений: 587
30.12.2014, 02:38
Студворк — интернет-сервис помощи студентам
IrineK,

C++ (Qt)
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
44
45
46
47
48
49
50
51
52
#include <iostream>
#include <cmath>
#include <cassert>
 
using namespace std;
 
typedef long double ld;
 
const int N = 1000;
const ld eps = 1e-15;
 
ld a[N];
 
bool less(const ld &a, const ld &b)
{
    return a + eps < b;
}
 
bool eq(const ld &a, const ld &b)
{
    return fabs(a - b) < eps;
}
 
int main(){
    int n;
    cin >> n;
    assert(n & 1);
    for(int i = 0; i < n; i++)
        cin >> a[i];
    int nn = n / 2;
 
    for(int i = 0; i < n; i++)
    {
        int cnt_less = 0, cnt_eq = 0;
        for(int j = 0; j < n; j++)
        {
            if(less(a[i], a[j]))
                cnt_less++;
            if(eq(a[i], a[j]))
                cnt_eq++;
        }
 
        if(cnt_less <= nn && cnt_less + cnt_eq >= nn + 1)
        {
            cout << "mediana == " << a[i] << endl;
            return 0;
        }
    }
 
    assert(false);
    return 0;
}
0
1406 / 648 / 135
Регистрация: 11.08.2011
Сообщений: 2,299
Записей в блоге: 2
30.12.2014, 22:00
Можно найти медиану за O(N), только массив придется изменять (не сортировать массив - имеется ввиду не использовать сортировку для получения ответа, а сам массив изменять можно?)
0
 Аватар для IrineK
2023 / 1641 / 425
Регистрация: 23.02.2011
Сообщений: 6,002
Записей в блоге: 25
31.12.2014, 01:40
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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
//------------------------------------------------------поиск медианы
#include <iostream>
 
double Max (double *arr, int N)
{
    double max = arr[0];
    for (int i = 1; i<N; i++)
        if (arr[i] > max)
            max = arr[i];
 
    return max;
}
 
double Min (double *arr, int N)
{
    double min = arr[0];
    for (int i = 1; i<N; i++)
        if (arr[i] < min)
            min = arr[i];
 
    return min;
}
 
bool SearchByMin (double *arr, int N, double &mediana)
{
    double A = Min (arr, N);
    double B = Max (arr, N);
    
    for (int i = 0; i< N/2 + 1; i++)
    {
        if (A == B)
        {
            mediana = A;
            return true;
        }
        
        double C = (A+B) / 2.;
        int count = 0;
        double M = A;
        
        for (int j = 0; j < N; j++)
        {   
            if (arr[j] <= C) 
            {   
                count++;
                if (arr[j] > M)
                    M = arr[j];
            }
            if (count == N/2 + 1 && arr[j] == M)
            {
                mediana = M;
                return true;
            }
        }
        if (count > N/2 + 1)
            B = M;
        else if (count < N/2 + 1)
            A = M;
        else
        {
            mediana = M;
            return true;
        }
    }
    return false;
}
 
bool SearchByMax (double *arr, int N, double &mediana)
{
    double A = Min (arr, N);
    double B = Max (arr, N);
    
    for (int i = 0; i< N/2 + 1; i++)
    {
        if (A == B)
        {
            mediana = A;
            return true;
        }
        
        double C = (A+B) / 2.;
        int count = 0;
        double M = B;
        for (int j = 0; j < N; j++)
        {   
            if (arr[j] >= C) 
            {   
                count++;
                if (arr[j] < M)
                    M = arr[j];
            }
            if (count == N/2 + 1 && arr[j] == M)
            {
                mediana = M;
                return true;
            }
        }
        if (count > N/2 + 1)
            B = M;
        else if (count < N/2 + 1)
            A = M;
        else
        {
            mediana = M;
            return true;
        }
    }
    return false;
}
 
//----------------------------------------------------------------------------
int main()
{   
    double arr[] = {1,2,3,3,3,3,2,2,2,2,3};
    int N = sizeof(arr) / sizeof(double);
 
    double mediana = -1;
    if (!SearchByMin (arr, N, mediana))
        SearchByMax (arr, N, mediana);
 
    std::cout << mediana;
    
    std::cin.sync(); std::cin.get();
    return 0;
}
//-----------------------------------------------------------------------------
Добавлено через 8 минут
SlavaSSU, если будет желание, поищите ещё багу )
0
221 / 166 / 47
Регистрация: 17.07.2012
Сообщений: 587
31.12.2014, 02:00
IrineK, иногда -1 выводит почему-то.

Добавлено через 2 минуты
да все верно. он не находит. просто рандомные тесты длиной 101.
0
 Аватар для IrineK
2023 / 1641 / 425
Регистрация: 23.02.2011
Сообщений: 6,002
Записей в блоге: 25
31.12.2014, 02:17
Т.е., не всегда мышей ловит.
ОК.
0
221 / 166 / 47
Регистрация: 17.07.2012
Сообщений: 587
31.12.2014, 02:20
48401479.41600 85855943.12100 17687422.35300 53919617.59200 128127293.46600 27691180.61700 18156075.96900 78684228.36900 17852063.26500 91614646.41900 107157320.75700 62551319.22000 122837387.44800 13469987.28300 79195637.03100 6143595.60300 61879860.49800 11853665.07000 12553054.50900 119710933.47300 52482818.06100 47841791.28600 77861524.41900 24983025.41100 67389564.31800 25631300.35500 99090438.32700 86741874.97500 64117304.91300 9760941.10200 55508942.78100 119448308.05500 99016774.61100 62584469.44200 71890668.50700 91445540.36100 61543761.64500 98283353.04000 28994842.48800 53252578.50600 85461671.04900 17519173.85100 115078623.83100 82352798.32500 52007251.23000 122713635.42600 73198143.25500 112443731.48400 34095603.53400 97107486.44700 49859744.04600 43322518.27500 96661088.20500 113410319.60400 7393712.37600 131407025.98200 113513559.28500 110002430.19000 77379383.97600 76106129.55000 128974785.97500 8131625.29200 6033413.18700 103690468.34100 75707195.16300 77671423.49100 68886059.07000 86673233.96400 37274433.73800 130782538.74600 20959442.52300

Добавлено через 28 секунд
это вот тест. в нем 71 число. просто файлик не грузится, так кинул
0
Эксперт С++
 Аватар для Mr.X
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
31.12.2014, 05:15
Цитата Сообщение от IrineK Посмотреть сообщение
А если они вообще double, как с ними бороться? )
А в чем проблема?
SlavaSSU, внутренний цикл не обязательно до конца проходить. Как только насчитали лишнее количество меньших или больших, так выходим:
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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
/////////////////////////////////////////////////////////////////////////////////////////
//В массиве содержится нечетное количество элементов 2n+1 элементов. Нужно найти n+1 
//по величине элемент, т.е. медиану массива и группу элементов с первыми n значениями, 
//т.е. если бы массив был упорядочен, то этот элемент находился бы в центре. Найти этот 
//элемент и левую половину. Вывести это на экран. Массив должен остаться в исходном состоянии. 
//Минимальное использование количества памяти.
/////////////////////////////////////////////////////////////////////////////////////////
#include <algorithm>
#include <iostream>
#include <vector>
/////////////////////////////////////////////////////////////////////////////////////////
typedef std::vector < double    >   T_numbers;
/////////////////////////////////////////////////////////////////////////////////////////
struct  T_is_mediana_of
{
    //-----------------------------------------------------------------------------------
    T_numbers  const    &   numbers_;
    //-----------------------------------------------------------------------------------
    T_is_mediana_of( T_numbers  const   &   numbers )
        :
        numbers_( numbers )
    {}
    //-----------------------------------------------------------------------------------
    bool    operator()  ( double    d )
    {
        size_t  less_count      =   0;
        size_t  great_count     =   0;
 
        for( size_t  i = 0; i < numbers_.size(); ++i )
        {
            if( numbers_[i]     <   d )
            {
                ++less_count;
            }
 
            if( numbers_[i]     >   d )
            {
                ++great_count;
            }
 
            if  (
                        less_count      >   numbers_.size() / 2
                    ||  great_count     >   numbers_.size() / 2
                )
            {
                return  false;
            }
        }//for
 
        return  true;
    }
    //-----------------------------------------------------------------------------------
};
/////////////////////////////////////////////////////////////////////////////////////////
double  get_mediana_of( T_numbers  const   &   numbers )
{
    return  *   std::find_if
                    (
                        numbers.begin       (),
                        numbers.end         (),
                        T_is_mediana_of     ( numbers )
                    );
}
/////////////////////////////////////////////////////////////////////////////////////////
int     main()
{
    std::locale::global(std::locale(""));
 
    int     n   =   0;
 
    do
    {
        std::cout   <<  "Введите нечетный размер массива: ";
        std::cin    >>  n;
    }
    while   (
                    n           <   1
                ||  n   %   2   ==  0
            );
 
    std::cout   <<  "Введите "
                <<  n
                <<  " чисел:"
                <<  std::endl;
 
    T_numbers   numbers(n);
 
    std::generate
        (
            numbers.begin   (),
            numbers.end     (),
 
            []              ()  ->  double
            {
                std::cout   <<  "-> ";
                double  d   =   0;
                std::cin    >>  d;
                return  d;
            }
        );
 
    std::cout   <<  std::endl
                <<  "Медиана = "
                <<  get_mediana_of( numbers )
                <<  std::endl;
 
    system("pause");
}
0
205 / 142 / 57
Регистрация: 25.12.2014
Сообщений: 447
31.12.2014, 09:54
Алгоритм BFPRT позволяет найти медиану за линейное время (сложность О(n)).
0
1406 / 648 / 135
Регистрация: 11.08.2011
Сообщений: 2,299
Записей в блоге: 2
31.12.2014, 09:55
Вот его я и имел ввиду.
0
Эксперт С++
 Аватар для Mr.X
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
31.12.2014, 12:50
Цитата Сообщение от TrueTerm Посмотреть сообщение
Алгоритм BFPRT позволяет найти медиану за линейное время (сложность О(n)).
Ну так автор просил не сортировать массив и не заводить новых.
А так-то std::nth_element для этого и написан. Может автору его и задали попрактиковать?
0
1406 / 648 / 135
Регистрация: 11.08.2011
Сообщений: 2,299
Записей в блоге: 2
31.12.2014, 13:10
Цитата Сообщение от Mr.X Посмотреть сообщение
сортировать массив
скорее всего имелось ввиду такое решение: отсортить массив и вывести элемент со средним индексом
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
31.12.2014, 13:10

Процедура: переставить элементы массива в обратном порядке (без использования дополнительного массива)
Есть массив чисел ,требуется с помощью процедуры переставить элементы массива в обратном порядке (без второго массива). Выбивает ошибку ...

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

Получить без использования дополнительного массива.
Даны действительные a1,a2,...,a20. Получить без использования дополнительного массива a12,a2,a14,a4,...,a20,a10,a1,a3,...,a19 ...

Транспонирование матрицы без использования дополнительного массива
У матрицы размером NxM поменять местами строки и столбцы (транспонировать). Вывести на экран дисплея исходную и транспонированную...

Транспонирование матрицы без использования дополнительного массива
Массив размерностью MxM. Необходимо, не используя дополнительного массива, транспонировать данную матрицу.


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

Или воспользуйтесь поиском по форуму:
31
Ответ Создать тему
Новые блоги и статьи
сукцессия 30. Фосфорный и азотный замки по "честному" закону лимитирования Либиха
anaschu 16.07.2026
Основные достижения за последние дни 1. Механизм отложенного высвобождения фосфора Добавлен специальный пул для медленного разложения меланизированных гиф ЕСМ Реализована разная скорость. . .
Запрет пометки на удаление и отмены проведения
Maks 16.07.2026
Алгоритм из решения ниже реализован на нетиповом документе "ПутевойЛист" разработанного в КА2. Задача: запретить помечать на удаление и отменять проведения путевого листа при условии, если он сдан. . .
Как надо было делать правильно - вообще не слушать ИИ, его дело - текст.
Hrethgir 15.07.2026
А вообще надо было делать не так, чтобы не исправлять ошибку https:/ / www. cyberforum. ru/ blogs/ 223907/ 10996. html , правильно было : удалил кнопку, а потом добавил её. Всё это стресс конечно. Почему?. . .
Знаете, от чего появляется стресс?
kumehtar 15.07.2026
Стресс появляется оттого, что вы, зная как поступить правильно, делаете наоборот. Ларри Уингет
Нас бьют, а мы крепчаем? Какая чушь!
kumehtar 15.07.2026
Вот это вот бытующее мнение, что человек меняется только под действием проблем, всегда считал вредоносным. Поверь, от проблем у людей появляются не изменения, а нервное расстройство и ПТСР. А. . .
сукцессия 29. Переход от одних деревьев на другие делать более или менее вероятностным?
anaschu 12.07.2026
Насколько смена типов микоризы — исключительное событие в двухвековой сукцессии? Оценка вероятности в пространстве параметров В текущей версии модели успешно реализован ключевой механизм. . .
сукцессия 27. Думаю, как переделывать уже написанную статью с планами на сукцессию.
anaschu 12.07.2026
Анализ соответствия модели требованиям Реализованные компоненты: Механизм закисления почвы через протонную помпу Конкуренция между типами микориз pH как триггер сукцессии C/ P соотношение. . .
Сукцессия 26. Мат модель создана.
anaschu 12.07.2026
Модель смены растительных сукцессий посредством управления грибами работает внутри небольшой ячейки почвы, восстанавливающейся после пожара, где ненадолго бывшее царство хвойных снова захватили. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru