Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
1185 / 755 / 127
Регистрация: 10.03.2012
Сообщений: 4,853

Отсортировать массив, чтобы сначала шли элементы массива которые есть в другом массиве

24.07.2023, 14:39. Показов 5260. Ответов 25
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
C++
1
2
int arr1[] = {15, 7, 2, 2, 105};
int arr2[] = {3, 2, 12 , 7, 15, 1, 0, 100};
Отсортировать массив arr2 таким образом, чтобы сначала шли элементы массива arr2 (отсортированные по возрастанию) которые есть в arr1,а дальше все остальные элементы отсортированные по возрастанию. Итоговый результат 2-7-15-0-1-3-12-100
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
24.07.2023, 14:39
Ответы с готовыми решениями:

Отсортировать список, чтобы сначала шли элементы списка которые есть в другом списке
List<int> list1 = new List<int> {15, 7, 2, 2, 105}; List<int> list2 = new List<int> {3, 2, 12 , 7, 15, 1, 0, 100}; Отсортировать...

Отсортировать массив так, чтобы сначала в нем шли нулевые элементы, затем положительные
Задан целочисленный массив размера N. Отсортировать массив так, чтобы сначала в нем шли нулевые, затем положительные и, в конце,...

Отсортировать массив так, чтобы сначала шли элементы из заданного диапазона, а потом остальные
Дан массив. Отсортировать его пузырьком так, чтобы вначале массива шел введенный диапазон , а после все остальные элементы. Ввод : 1 2...

25
631 / 526 / 104
Регистрация: 05.08.2022
Сообщений: 2,810
24.07.2023, 15:02
И? в чем у вас сложность?
Давайте ваш вариант, пусть нерабочий, подскажем что поправить
0
Заблокирован
24.07.2023, 15:23
Самый простой вариант, пройтись по массиву два, все совпадающие элементы с массивом один, перенести в начало.
При этом подсчитывая количество переносов.
Отсортировать первую часть массива, потом вторую.
1
 Аватар для igorrr37
2870 / 2017 / 991
Регистрация: 21.12.2010
Сообщений: 3,733
Записей в блоге: 8
24.07.2023, 18:10
Лучший ответ Сообщение было отмечено IGPIGP как решение

Решение

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
#include <iterator>
#include <algorithm>
#include <ranges>
namespace rng = std::ranges;
 
// нужна поддержка c++20
int main()
{
    int arr1[] = { 15, 7, 2, 2, 105 };
    int arr2[] = { 3, 2, 12 , 7, 15, 1, 0, 100 };
    rng::sort(arr1); // сортируем 1й массив для двоичного поиска 
    auto subr = rng::partition(arr2, [&arr1](auto val) {return rng::binary_search(arr1, val); }); // разбиваем 2й массив на две части
    rng::sort(subr); // сортируем 2ю часть 2го массива
    rng::sort(arr2, subr.begin()); // сортируем 1ю часть 2го массива
    rng::copy(arr2, std::ostream_iterator<int>{std::cout, " "}); // вывод на экран
}
2
2487 / 1151 / 709
Регистрация: 25.04.2016
Сообщений: 3,315
24.07.2023, 20:36
c++11 и выше

массивы c-style
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
#include <iomanip>
#include <iostream>
#include <algorithm>
using namespace std;
 
enum {N = 5, M = 8};
 
void printf_arr (int [], int);
bool element_in (int [], int, int);
 
int main (void) {
    int arr1[N] = {15, 7, 2, 2, 105};
    int arr2[M] = {3, 2, 12 , 7, 15, 1, 0, 100};
 
    printf_arr(arr1, N);
    printf_arr(arr2, M);
 
    int k = 0;
    for (int i = 0; i < M; i++)
        if ( element_in(arr1, N, arr2[i]) )
            swap(arr2[i], arr2[k++]);
 
    sort(arr2, arr2 + k);
    sort(arr2 + k, arr2 + M);
 
    cout << endl;
    printf_arr(arr2, M);
    return 0;
}
// -------------------------------------------------------------
void printf_arr (int a[], int size) {
    for (int i = 0; i < size; i++)
        cout << setw(4) << a[i];
    cout << endl;
}
// -------------------------------------------------------------
bool element_in (int a[], int size, int value) {
    bool result = false;
    for (int i = 0; i < size && !result; i++)
        result = (a[i] == value);
    return result;
}
// -------------------------------------------------------------
векторы
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
#include <vector>
#include <iomanip>
#include <iostream>
#include <algorithm>
using namespace std;
 
void printf_arr (vector <int>);
bool element_in (int, vector <int>);
 
int main (void) {
    vector <int> a = {15, 7, 2, 2, 105};
    vector <int> b = {3, 2, 12 , 7, 15, 1, 0, 100};
 
    printf_arr(a);
    printf_arr(b);
 
    size_t k = 0;
    for (size_t i = 0; i < b.size(); i++)
        if ( element_in(b[i], a) )
            swap(b[i], b[k++]);
 
    sort(&b[0], &b[k]);
    sort(&b[k], &b[b.size()]);
 
    cout << endl;
    printf_arr(b);
    return 0;
}
// -------------------------------------------------------------
void printf_arr (vector <int> a) {
    for (int n : a)
        cout << setw(4) << n;
    cout << endl;
}
// -------------------------------------------------------------
bool element_in (int value, vector <int> a) {
    bool result = false;
    for (size_t i = 0; i < a.size() && !result; i++)
        result = (value == a[i]);
    return result;
}
// -------------------------------------------------------------
Как уже упоминалось постом выше, если предварительно отсортировать первый массив, то вместо линейного можно использовать бинарный поиск.
2
Заблокирован
24.07.2023, 20:56
Хоть сортировка и бинарный поиск из одной темы, все же учат сначала сортировку.
Так как бинарный поиска происходит по уже отсортированной последовательности.
Если ТС не знает что это, хоть название алгоритма услышит.
Может тяга к непознанному преобладает и ТС освоит новый алгоритм )
0
2487 / 1151 / 709
Регистрация: 25.04.2016
Сообщений: 3,315
24.07.2023, 22:26
Немного уточню про c-style массивы, если их размер нам неизвестен, т.е. массивы определены как
Цитата Сообщение от Whitecolor Посмотреть сообщение
int arr1[] = {15, 7, 2, 2, 105};
int arr2[] = {3, 2, 12 , 7, 15, 1, 0, 100};
то начиная с с++11 мы можем использовать begin() и end() для определения размера, например:
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
#include <iomanip>
#include <iostream>
#include <algorithm>
using namespace std;
 
void printf_arr (int a[], size_t size) {
    for (size_t i = 0; i < size; i++)
        cout << setw(4) << a[i];
    cout << endl;
}
 
int main (void) {
    int a[] = {15, 7, 2, 2, 105};
    int b[] = {3, 2, 12 , 7, 15, 1, 0, 100};
 
    size_t a_size = end(a) - begin(a);
    size_t b_size = end(b) - begin(b);
 
    printf_arr(a, a_size);
    printf_arr(b, b_size);
 
    size_t k = 0;
    for (size_t i = 0; i < b_size; i++)
        if (find(begin(a), end(a), b[i]) != end(a))
            swap(b[i], b[k++]);
 
    sort(&b[0], &b[k]);
    sort(&b[k], &b[b_size]);
 
    cout << endl;
    printf_arr(b, b_size);
    return 0;
}
0
Заблокирован
24.07.2023, 23:18
Цитата Сообщение от stake-k26 Посмотреть сообщение
то начиная с с++11 мы можем использовать begin() и end()
И не забыть необходимый хидер подключить для них.
0
 Аватар для Наталья8
518 / 368 / 65
Регистрация: 09.03.2016
Сообщений: 3,890
25.07.2023, 01:26
Чё умничать то ? Было бы из за чего.

C++
1
2
3
4
5
int b[] = { 3, 2, 12, 7, 15, 1, 0, 100 };
    
    size_t len = sizeof(b) / sizeof(b[0]);
        std::printf("%d", len);
        std::cin.get();
Добавлено через 1 минуту
Я ни за что не стал бы ни чего наворачивать из за такой хрени.
0
2487 / 1151 / 709
Регистрация: 25.04.2016
Сообщений: 3,315
25.07.2023, 01:59
Цитата Сообщение от SmallEvil Посмотреть сообщение
необходимый хидер
это какой?

C++
1
2
3
4
5
6
7
#include <iostream>
 
int main (void) {
    int a[] = {1, 2, 3};
    std::cout << std::end(a) - std::begin(a) << std::endl;
    return 0;
}
они же в std.
0
Заблокирован
25.07.2023, 12:42
Цитата Сообщение от stake-k26 Посмотреть сообщение
они же в std.
Много в std:: , например std::map, но нам нужен его хидер.

Цитата Сообщение от stake-k26 Посмотреть сообщение
это какой?
На выбор :
Defined in header <array>
Defined in header <deque>
Defined in header <forward_list>
Defined in header <iterator>
Defined in header <list>
Defined in header <map>
Defined in header <regex>
Defined in header <set>
Defined in header <span> (since C++20)
Defined in header <string>
Defined in header <string_view> (since C++17)
Defined in header <unordered_map>
Defined in header <unordered_set>
Defined in header <vector>
Добавлено через 9 минут
Цитата Сообщение от Наталья8 Посмотреть сообщение
Чё умничать то ? Было бы из за чего.
Цитата Сообщение от Наталья8 Посмотреть сообщение
size_t len = sizeof(b) / sizeof(b[0]);
И так каждый раз для каждого массива ? Но это же много буков.
Много буков




Добавлено через 1 минуту
Цитата Сообщение от stake-k26 Посмотреть сообщение
std::end(a) - std::begin(a)
std::size для такого есть
0
2487 / 1151 / 709
Регистрация: 25.04.2016
Сообщений: 3,315
26.07.2023, 01:04
Цитата Сообщение от SmallEvil Посмотреть сообщение
На выбор
я выше приводил пример, где вообще ничего не подключал, там даже iostream по сути не нужен.

std::size есть и он в таком случае удобнее, но чаще всего нам бывает нужен итератор контейнера, а begin и end как раз и возвращают итераторы, которые мы затем можем использовать.. да много где, в тех же for_each, sort, find, например.
0
Заблокирован
26.07.2023, 01:15
Цитата Сообщение от stake-k26 Посмотреть сообщение
я выше приводил пример, где вообще ничего не подключал, там даже iostream по сути не нужен.
Я тоже много магических примеров могу привести,но это ничего не доказывает.
В вашем конкретном примере где то эта либа подхватилась, хотя не должна была.
А в другом компиляторе, уже будет ошибка компиляции.
И у вас столько одобрительных ответов. а вы таких мелочей не знаете.

Добавлено через 43 секунды
Цитата Сообщение от stake-k26 Посмотреть сообщение
я выше приводил пример, где вообще ничего не подключал
я могу привести пример где я даже компьютер не включал , а моя программа будет выполнена , гы )
0
2487 / 1151 / 709
Регистрация: 25.04.2016
Сообщений: 3,315
26.07.2023, 01:33
Цитата Сообщение от SmallEvil Посмотреть сообщение
хотя не должна была
Что значит не должна была? Типа магия приключилась? Я знал, что они будут доступны в std в порядке наследования, как те же swap, min, max и много чего еще. Другой вопрос, что я сильно сомневаюсь, что на данном этапе новичку вообще нужно понимание ордера наследования и формирования пространства имен.

Добавлено через 52 секунды
Если найдете компилятор, который выдаст ошибку, дайте знать.
0
Заблокирован
26.07.2023, 02:12
Цитата Сообщение от stake-k26 Посмотреть сообщение
Я знал, что они будут доступны в std в порядке наследования, как те же swap, min, max и много чего еще.
Нет конечно, это просто у вас такое сделали, и все.
Цитата Сообщение от stake-k26 Посмотреть сообщение
понимание ордера наследования
гичего такого воообще не знаю, и никогда не видел. просветите подробнее.

Добавлено через 5 минут
Цитата Сообщение от stake-k26 Посмотреть сообщение
Типа магия приключилась?
Нет, типа вас кормят с ложечки, а вы послушно хаваете. )

Добавлено через 12 минут
Цитата Сообщение от stake-k26 Посмотреть сообщение
Я знал, что они будут доступны в std в порядке наследования, как те же swap, min, max и много чего еще.
Еще раз, про какой такой "порядок наследования" вы говорите ?
И еще раз повторюсь.
Цитата Сообщение от stake-k26 Посмотреть сообщение
как те же swap, min, max и много чего еще
для каждой из етих функций/классов, нужно в обязательном порядке подключать необходимые хидеры, иначе компилятор не гарантирует что они будут видимы и доступны для использования.

Добавлено через 2 минуты
stake-k26, еще скажите что setlocle(LC_ALL, "Russian")
решает проблемы русских символов )))
0
26.07.2023, 05:17

Не по теме:

SmallEvil, чтобы не разводить тут флуд не по теме, я отправил вам сообщение в личку.

0
0 / 0 / 5
Регистрация: 05.01.2015
Сообщений: 46
05.08.2023, 22:56
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
 #include <iostream>
#include <algorithm>
using namespace std;
 
int main() {
    const int arr1[] = { 1, 3, 4, 2, 5 };
    const int arr2[] = { 4, 1, 2 };
 
    int arr3[5];
    copy(arr2, arr2 + 3, arr3);
 
    sort(arr3, arr3 + 3);
    cout << "Sorted array: ";
    for (int i = 0; i < 3; i++) {
        cout << arr3[i] << " ";
    }
    cout << endl;
 
    return 0;
}
0
Заблокирован
05.08.2023, 23:24
Nuckles, ваш код (пост №17) не соответствует задаче.
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9005 / 4706 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
06.08.2023, 00:07
Хех... Я сначала кинулся и написал, а потом увидел у igorrr37, решение которое совершенно сходно с моим. Что же... Пусть будет как С++11 вариант)
stake-k26, итераторы на массиве требуют заголовочника <iterator>. В коде что я приведу - std::sort кушает указатели, а std::lower_bound нет) Приходится подключать и юзать. Я специально не приводил всё к итераторам, чтобы показать. Ну а то что перед поиском нужно отсортировать, совершенно согласен с вами.

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
#include <iostream>
#include <algorithm>
#include <iterator>
int main()
{
    int arr1[] = { 15, 7, 2, 2, 105 };
    int arr2[] = { 3, 2, 12 , 7, 15, 1, 0, 100 };
    auto end_arr1_ptr=arr1+sizeof(arr1)/sizeof(*arr1);
    std::sort(arr1, end_arr1_ptr);
    size_t count_same_elements(0);
 
    std::partition(arr2, arr2+sizeof(arr2)/sizeof(*arr2),
                   [arr1, &count_same_elements](int a)
                   {
                    auto ptr=std::lower_bound(std::begin(arr1), std::end(arr1), a);
                    if(ptr!=std::end(arr1) && *ptr==a)
                    {
                        ++count_same_elements;
                        return true;
                    }
                    return false ;
                   }
                   );                  
                   std::sort(arr2, arr2+count_same_elements);
                   std::sort(arr2+count_same_elements, arr2+sizeof(arr2)/sizeof(*arr2));
                   for(auto a:arr2)std::cout<<a<<' ';
 
 
    return 0;
}
0
Заблокирован
16.08.2023, 23:27
Цитата Сообщение от stake-k26 Посмотреть сообщение
Я знал, что они будут доступны в std в порядке наследования, как те же swap, min, max и много чего еще.
Цитата Сообщение от stake-k26 Посмотреть сообщение
Если найдете компилятор, который выдаст ошибку, дайте знать.
Дело не в компиляторе.
Дело именно в заголовочных файлах.

На практике вы очень редко будете подключать <iostream>.
Ох уж эти, "и так сойдет".
C++
1
2
3
4
5
6
7
8
9
10
// some module
#include <cstdint> // helper types
// some classes and functions
 
// and some function for example
void dosometing()
{
    uint64_t a,b;
    std::swap(a, b); // ‘swap’ is not a member of ‘std’
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
16.08.2023, 23:27
Помогаю со студенческими работами здесь

Отсортировать массив так, чтобы в нем сначала шли буквы латинского алфавита, затем цифры и, в конце, остальные элементы
Задан символьный массив размера N. Отсортировать массив так, чтобы в нем сначала шли буквы латинского алфавита, затем цифры и, в конце,...

Массив: Переставить числа в массиве так, чтобы сначала шли элементы, меньшие b, равные b, а потом большие b...
Дан массив a и число b. Переставить числа в массиве таким образом, чтобы сначала шли элементы, меньшие b, затем равные b, а лишь затем...

Дан массив a[n] и число b. Переставить числа в массиве таким образом, чтобы сначала шли элементы, меньшие b
Дан массив a и число b. Переставить числа в массиве таким образом, чтобы сначала шли элементы, меньшие b, затем равные b, а лишь затем...

Из массива переписать числа во второй массив так, чтобы сначала шли четные элементы, затем нули, потом нечетные элементы
Доброго времени суток! Помогите решить задание на с#: Из одномерного целочисленного массива переписать все числа во второй массив так,...

Переставить элементы первого списка, чтобы сначала шли элементы, которые встречаются во втором списке
1) переставить елементы 1го списка таким образом, что бы сначала шли те элементы, что встречаются во втором списке, а дальше те, что не...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru