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

Как отсортировать элементы массива в соответствии с определённым условием?

24.02.2017, 00:45. Показов 4514. Ответов 15

Студворк — интернет-сервис помощи студентам
задание такое дан массив например 10 элементов(вообще там не важно может быть и 100 и 200 ) заполняем случайными числами от 1 до 10(от 1 до n где n это размер массива) без повторений, вопрос такой как отсортировать элементы массива так чтобы элементы стоящие рядом имели разность по модулю больше либо равно 5.

например массив из 5 элементов
4 3 5 2 1
сортируем чтобы разность по модулю была больше либо равна 2
на выходе должны получить
4 2 5 3 1

как бы я не старался не получается пробывал пузырьком и вставками.
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
24.02.2017, 00:45
Ответы с готовыми решениями:

Отсортировать одним из методов элементы массива в соответствии с заданием
Создайте массив А, содержащий 8 различных символов. Отсортируйте его по возрастанию. Организуйте и выведите на экран целочисленный...

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

Изображения в соответствии определенным элементам массива
Здравствуйте, уважаемые знатоки Java! Надеюсь, что пишу в правильный раздел. Опыт работы с Java у меня небольшой и писать программы с...

15
1617 / 1182 / 553
Регистрация: 08.01.2012
Сообщений: 4,561
24.02.2017, 01:50
перебором с откатом
0
5 / 5 / 3
Регистрация: 31.01.2017
Сообщений: 31
24.02.2017, 06:53
Лучший ответ Сообщение было отмечено gru74ik как решение

Решение

fedot199614, написать компаратор по Вашему условию и в функцию сортировки передать.
0
1617 / 1182 / 553
Регистрация: 08.01.2012
Сообщений: 4,561
24.02.2017, 07:25
всего один вариант:5 10 4 9 3 8 2 7 1 6, второй зеркальный
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38173 / 21108 / 4307
Регистрация: 12.02.2012
Сообщений: 34,705
Записей в блоге: 14
24.02.2017, 08:59
Прежде, чем решать задачу, полезно задуматься: а имеет ли она решение? Приведенная задача имеет решения далеко не всегда.
0
-16 / 14 / 3
Регистрация: 22.01.2013
Сообщений: 154
24.02.2017, 13:27
Для разминки тебе. Ставь свои условия и вперёд( лямбдой):
C++
1
2
3
4
   vector <int> Y;
   vector <int> W;
adjacent_difference(begin(X), end(X),  back_inserter(Y)); // дельта-кодирование
partial_sum(begin(Y), end(Y), back_inserter(W));  //дельта-декодирование
0
1 / 1 / 0
Регистрация: 20.10.2012
Сообщений: 56
24.02.2017, 16:56  [ТС]
я нашёл решение
кусок главного кода
C++
1
2
3
4
5
6
7
8
9
for(int i=0;i<200;i++){
   for(int j=i+1;j<199;j++){
      if(abs(arr[i]-arr[j])>=5){
       swap(arr[i+1],arr[j]);
       break;
       }
 
   }
}
Добавлено через 12 минут
это для моей задачи в 200 элементов а мы рассмотрим алгоритм на примере массива с 5 элементами
алгоритм такой например дан массив из 5 элементов 4 3 5 2 1 надо расставить с разницей больше либо равно 2
проверяем
4-3=1 не меняем ничего
4-5=1 не меняем ничего
4-2=2 меняем след элемент после 4 это 3 с элементом который нам подходит это 2
получаем 4 2 5 3 1
благодаря break перестановка будет только одна и итерация индекса внешнего цикла увеличится на 1 соотвецтвенно проверяется элемент 2
2-5=3 сразу нам подходит переходим к свапу т.к след элемент после 2 это 5 и подходя щий элемент тоже 5 получается что 5 перезапишет сама себя и останется на месте и получим
4 2 5 3 1
следующей проверяется 5
5-3 ничего
5-1 подходит
соотвецтвенно меняем 3 и 1 местами и получаем отсортированный массив
4 2 5 1 3 который подходит под наше условие.

всем спс.
0
1617 / 1182 / 553
Регистрация: 08.01.2012
Сообщений: 4,561
24.02.2017, 17:06
сократите до 10, как у ТС, так и проверять легче, не работает это
0
1 / 1 / 0
Регистрация: 20.10.2012
Сообщений: 56
26.02.2017, 18:07  [ТС]
Цитата Сообщение от MansMI Посмотреть сообщение
сократите до 10, как у ТС, так и проверять легче, не работает это
эм у меня всё работает
вот полный код + элементы в массиве должны быть без повторений. на выходе получаем разницу в 2 и выше между соседними элементами.
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
#include "stdafx.h"
#include <iostream>
#include <cstdlib>
#include <time.h>
using namespace std;
 
int main()
{
    setlocale(LC_ALL, "");
    srand(time(0));
    int arr[10];
 
    //заполняем массив элементами без повторений
    for (int i = 0; i<10; i++) {
        arr[i] = i + 1;
}
 
    for (int i = 0; i<10; i++) {
        swap(arr[i], arr[rand() % 10]);
    }
    //выводим заполненный массив
    cout << "Ваш массив:" << endl;
    for (int i = 0; i<10; i++) {
        cout<<arr[i]<<"| ";
    }
 
    //сортируем его по условию
    for (int i = 0; i<10; i++) {
        for (int j = i + 1; j<9; j++) {
            if (abs(arr[i] - arr[j]) >= 2) {
                swap(arr[i + 1], arr[j]);
                break;
            }
 
        }
    }
 
    //выводим отсортированный массив
    cout << "\n" << endl;
    cout << "Ваш отсортированный массив:" << endl;
    for (int i = 0; i<10; i++) {
        cout << arr[i] << "| ";
 
    }
 
    system("pause");
    return 0;
}
вот что получаем на выводе

вот несколько раз сгенерировал

[img]src="https://i.paste.pics/4fdfa9f4245b3447aad013786b162e24.png[/img]
Миниатюры
Как отсортировать элементы массива в соответствии с определённым условием?  
0
1617 / 1182 / 553
Регистрация: 08.01.2012
Сообщений: 4,561
26.02.2017, 18:11
Цитата Сообщение от fedot199614 Посмотреть сообщение
так чтобы элементы стоящие рядом имели разность по модулю больше либо равно 5.
когда переиначили?
0
1 / 1 / 0
Регистрация: 20.10.2012
Сообщений: 56
26.02.2017, 18:27  [ТС]
Цитата Сообщение от MansMI Посмотреть сообщение
когда переиначили?
я немного перепутал 5 для задачи в 200 элементов а для 10 она невозможна (вроде как)
но т.к исправить после 5 минут пост нельзя так и осталось а я и забыл,
а 2 можно взять для модели массива из 10 элементов.
если работает логика для 10 то и для 200 тоже будет работать по идее, но я только что нашёл ошибку у себя и не знаю как её исправить.
по алгоритму получается что в конце массива если встретятся такой набор 8 6 5 то только в этом случаи не получается
получается что для 8 6 подходит и оно поменяет само себя, далее 6 и 5
6-5=1 ничего не поменяет да и нес чем ведь массив закончился(

Добавлено через 5 минут
вот пример

но я был близко))
0
1617 / 1182 / 553
Регистрация: 08.01.2012
Сообщений: 4,561
26.02.2017, 18:31
возможна #4, а ваш алгоритм работает от случая к случаю 3 1 4 5....
0
1 / 1 / 0
Регистрация: 20.10.2012
Сообщений: 56
26.02.2017, 18:55  [ТС]
Цитата Сообщение от MansMI Посмотреть сообщение
возможна #4, а ваш алгоритм работает от случая к случаю 3 1 4 5....
всё норм работает только проблема с последними элементами
я не могу понять почему у вас не работает. сколько я не генерирую в середине массива всё нормально возникает проблема только в конце которую я описал выше

Добавлено через 8 минут
попробовал решить проблему вот таким образом(повезло что массив не динамический)
C++
1
2
3
if (abs(arr[8] - arr[9]) < 2 && abs(arr[5] - arr[9]) >= 2) {
        swap(arr[6], arr[9]);
    }
вот полный код
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
// задание 4.cpp: определяет точку входа для консольного приложения.
//
 
#include "stdafx.h"
#include <iostream>
#include <cstdlib>
#include <time.h>
using namespace std;
 
int main()
{
    setlocale(LC_ALL, "");
    srand(time(0));
    int arr[10];
 
    //заполняем массив элементами без повторений
    for (int i = 0; i<10; i++) {
        arr[i] = i + 1;
}
 
    for (int i = 0; i<10; i++) {
        swap(arr[i], arr[rand() % 10]);
    }
    //выводим заполненный массив
    cout << "Ваш массив:" << endl;
    for (int i = 0; i<10; i++) {
        cout<<arr[i]<<"| ";
    }
 
    //сортируем его по условию
    for (int i = 0; i<10; i++) {
        for (int j = i + 1; j<9; j++) {
            if (abs(arr[i] - arr[j]) >= 2) {
                swap(arr[i + 1], arr[j]);
                break;
            }
 
        }
    }
    //решение проблемы в конце массива
    if (abs(arr[8] - arr[9]) < 2 && abs(arr[5] - arr[9]) >= 2) {
        swap(arr[6], arr[9]);
    }
 
    //выводим отсортированный массив
    cout << "\n" << endl;
    cout << "Ваш отсортированный массив:" << endl;
    for (int i = 0; i<10; i++) {
        cout << arr[i] << "| ";
 
    }
    cout << endl;
    system("pause");
    return 0;
}
0
-16 / 14 / 3
Регистрация: 22.01.2013
Сообщений: 154
26.02.2017, 19:37
Я тут для любознательных выкладывал дельта-кодирование.
0
1 / 1 / 0
Регистрация: 20.10.2012
Сообщений: 56
26.02.2017, 20:37  [ТС]
Цитата Сообщение от gavrasio Посмотреть сообщение
Я тут для любознательных выкладывал дельта-кодирование.
я ещё этого не умею
0
1 / 1 / 0
Регистрация: 20.10.2012
Сообщений: 56
05.03.2017, 19:42  [ТС]
вот нормальное решение ошибки в конце в место этого
C++
1
2
3
if (abs(arr[8] - arr[9]) < 2 && abs(arr[5] - arr[9]) >= 2) {
        swap(arr[6], arr[9]);
    }
вот это
C++
1
2
3
4
5
6
7
8
9
if(abs(arr[18]-arr[19])<2){
        for(int i=15; i>=0;i--){
             if(abs(arr[i]-arr[19])>=2 && abs(arr[i+2]-arr[19])>=2 && abs(arr[i+1]-arr[18])>=2){
                    swap(arr[i+1],arr[19]);
                    break;
 
                }
            }
        }
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
05.03.2017, 19:42
Помогаю со студенческими работами здесь

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

Генерация двумерного массива с определённым условием
Здравствуйте, обращаюсь за помощью тут впервые) Начал изучение языка С++ и друг подкинул такую задачку.. Надо создать автоматический...

Составить программу по обработке одномерного массива в соответствии с условием задания
10. В массиве В(n) найти среднее арифметическое всех чисел, которые меньше заданного числа. Вывести сумму, количество, среднее...

Как проверить есть ли в таблице две одинаковых строки с определенным условием
Условие: равенство одного из полей некоторому значению...

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


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

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
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 Использованы. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru