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

Сортировка массива "сменой мест" за один проход

03.06.2022, 01:35. Показов 365. Ответов 2
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здраствуйте. Не могу справиться со вторым заданием.

а). Предположим, Х(1:N) содержит только значения 1 и 2 Напишите программу упорядочения на основе принципа «смены мест» (т.е. в программе значения Х(I) изменяются только путем «обмена» с некоторым Х(J), причем считать число элементов каждого типа запрещено). Время работы такой программы пропорционально N и программа заканчивается за один проход по массиву.
б). Условия аналогичны предыдущим условиям задачи, но в массиве встречаются лишь значения 1, 2 и 3
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
03.06.2022, 01:35
Ответы с готовыми решениями:

Сортировка массива за один проход
Помогите. Нужно отсортировать массив так, чтобы справа были отрицательные, слева положительные и...

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

Сортировка в один проход по нескольким полям
Добрый вечер, #include <iostream> #include <ctime> #include <vector> #include <algorithm>...

Среди элементов массива Z (m) найти k (k << m) крупнейших. Поиск осуществить за один проход (просмотр) массива Z
Среди элементов массива Z (m) найти k (k &lt;&lt; m) крупнейших. Поиск осуществить за один проход...

Найти k наибольших элементов массива (за один проход)
среди элементов массива Z(m) найти к наибольших(к&lt;&lt;m) . поиск осуществить за один проход по массиву

2
Вездепух
Эксперт CЭксперт С++
11691 / 6370 / 1723
Регистрация: 18.10.2014
Сообщений: 16,053
03.06.2022, 06:33 2
Цитата Сообщение от antonkamb Посмотреть сообщение
б). Условия аналогичны предыдущим условиям задачи, но в массиве встречаются лишь значения 1, 2 и 3
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void part_123(unsigned a[], unsigned n)
{
  unsigned dst1 = 0, dst3 = n;
  
  for (unsigned i = 0; i < dst3; )
    if (a[i] == 1)
      std::swap(a[dst1++], a[i++]);
    else if (a[i] == 3)
      std::swap(a[--dst3], a[i]);
    else
    {
      assert(a[i] == 2);
      ++i;
    }
}
0
2848 / 1997 / 986
Регистрация: 21.12.2010
Сообщений: 3,705
Записей в блоге: 10
03.06.2022, 13:02 3
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
#include <iostream>
#include <vector>
#include <algorithm>
#include <numeric>
#include <random>
 
std::vector<unsigned> vct({ 3,3,1,3,1,1,3,2,2,2 }); // массив
 
// ф-ция упорядочения на основе принципа «смены мест»
void partition()
{
    unsigned i{}, j{ vct.size() - 1 };
    for ( ; i < j; ++i)
    {
        if (vct[i] != vct.front())
            break;
    }
    if (i == j)
        return;
    if (vct[j] == vct[i - 1])
    {
        std::swap(vct[j], vct[i]);
        while (vct[i] == vct.front())
            ++i;
        while (vct[j] == vct.back())
            --j;
    }
    for ( ; j > i; --j)
    {
        if (vct[j] != vct.back())
            break;
    }
    for (int k = i; k <= j; )
    {
        if (vct[k] == vct.front() || vct[k] == vct.back())
        {
            while (k <= j && (vct[k] == vct.front() || vct[k] == vct.back()))
            {
                if (vct[k] == vct.front())
                {
                    std::swap(vct[k], vct[i]);
                    while (vct[i] == vct.front())
                        ++i;
                    k = i;
                }
                if (vct[k] == vct.back())
                {
                    std::swap(vct[k], vct[j]);
                    while (vct[j] == vct.back())
                        --j;
                    while (vct[i] == vct.front())
                        ++i;
                    k = i;
                }
            }
        }
        else
        {
            ++k;
        }
    }
}
 
int main()
{
#if 0
    // тест для одного конкретного массива
    for (auto val : vct)
    {
        std::cout << val << " ";
    }
    std::cout << "\n\n";
    partition();
    for (auto val : vct)
    {
        std::cout << val << " ";
    }
    std::cout << "\n\n";
#else
    // тест для пяти рандомных массивов
    std::mt19937 eng{ (unsigned)time(nullptr) };
    std::uniform_int_distribution uid{ 1,3 };
    for (int i = 0; i < 5; ++i)
    {
        for (auto& val : vct)
        {
            val = uid(eng);
            std::cout << val << ",";
        }
        std::cout << "\n";
        partition();
        for (auto val : vct)
        {
            std::cout << val << " ";
        }
        std::cout << "\n\n";
    }
    
#endif
}
0
03.06.2022, 13:02
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
03.06.2022, 13:02
Помогаю со студенческими работами здесь

Количество минимальных элементов массива за один проход
Здравствуйте! Очень нужна помощь! Есть достаточно простая задачка: &quot;В массиве хранится информация...

Проверить геометрическая ли прогрессия без массива за один проход
И за один проход Я решала исходя из того, что (a2)^2-(a1)(a3)==0 если геом прогрессия. Но у меня...

Найти максимальный элемент массива и их количество за один проход по массиву
Дан массив целых чисел. Найти максимальный элемент массива и их количество за один проход по...

Найти максимальную сумму элементов строк в один проход массива
2) Напишите программу, решающую поставленную задачу в один проход массива. задача:Ищет в...

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


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru