Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.80/35: Рейтинг темы: голосов - 35, средняя оценка - 4.80
0 / 0 / 0
Регистрация: 28.02.2022
Сообщений: 3

Переставить данные в ячейках так, чтобы в начале шли четные числа, а потом нечетные

11.12.2024, 14:44. Показов 9581. Ответов 53
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
На вход функции подается заполненный одномерный массив типа int.

Необходимо, чтобы функция переставила данные в ячейках так, чтобы вначале шли четные числа, а потом нечетные. Сортировать числа не нужно.

Ограничение: не используйте вспомогательный массив.

Пример:

Входной массив: {4, 8, 9, 3, 11, 7, 0, 2, 1}

Пример выходного массива: {4, 8, 0, 2, 9, 3, 11, 7, 1}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
11.12.2024, 14:44
Ответы с готовыми решениями:

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

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

Преобразовать массив так, чтобы сначала шли четные числа, а потом – нечетные
Друзья !есть такая задачка:Задан массив А из N чисел. Преобразовать этот массив так, чтобы сначала шли четные числа, а потом – нечетные.Сам...

53
1956 / 874 / 352
Регистрация: 05.09.2021
Сообщений: 1,387
27.12.2024, 10:33
Студворк — интернет-сервис помощи студентам
Alexander 1345,
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
int[] a = [4, 8, 9, 3, 11, 7, 0, 2, 1];
 
var offset = 0;
for (int i = 0; i < a.Length; i++)
{
    if (a[i] % 2 == 0)
    {
        (a[offset], a[i]) = (a[i], a[offset]);
        offset++;
    }
}
 
Console.WriteLine(string.Join(", ", a));
Code
1
4, 8, 0, 2, 11, 7, 9, 3, 1
4
 Аватар для zhunshun
768 / 496 / 216
Регистрация: 05.04.2015
Сообщений: 2,080
27.12.2024, 19:56
anton78spb, это прекрасно
1
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,175
Записей в блоге: 2
03.01.2025, 16:12
Цитата Сообщение от andreyfreelans Посмотреть сообщение
Используем LINQ для группировки четных и нечетных чисел
Нарушение условия:
Цитата Сообщение от Alexander 1345 Посмотреть сообщение
не используйте вспомогательный массив.
Цитата Сообщение от zhunshun Посмотреть сообщение
array.GroupBy(n => n % 2 == 0);
Нарушение условия:
Цитата Сообщение от Alexander 1345 Посмотреть сообщение
чтобы функция переставила данные в ячейках
То есть нужно переставить числа в массиве, а не получить новую последовательность.
Whitecolor, roach1967, Doomov, kva52 не тестировал, но на первый взгляд во всех решениях есть перестановка нечётного числа куда-то в массиве.
Хоть в условии указано Сортировать числа не нужно, а то что вы делаете это не сортировка, но тем не менее, если посмотреть решение примера в задании, то ясно, что последовательность чисел не должна меняться.
Например, в варианте от Whitecolor результат:
{4, 8, 0, 2, 11, 7, 9, 3, 1}, в задании должен быть получен:
{4, 8, 0, 2, 9, 3, 11, 7, 1}

Из всех решений правильный результат выдаёт только вариант kolorotur. За единственным возможно замечанием - не известно допускается ли использовать "встроенные" методы или можно использовать только свои "самописные"?

Добавлено через 11 минут
Вариант "самописного" метода:
C#
1
2
3
4
5
6
{
    int[] arr = { 4, 8, 9, 3, 11, 7, 0, 2, 1 };
    Console.WriteLine(string.Join(", ", arr));
    RearrangeEvenOdd(arr);
    Console.WriteLine(string.Join(", ", arr));
}
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
static void RearrangeEvenOdd(IList<int> arr)
{
    for (int i = 0; i < arr.Count; i++)
    {
        if (arr[i] % 2 == 1) // Ищем очередной нечётный
        {
            // Ищем первый чётный после него
            int j = i + 1;
            for (; j < arr.Count && arr[j] % 2 == 1; j++) { }
 
            // Если дальше все нечётные, то выход из цикла.
            if (j == arr.Count)
                break;
 
            // Иначе сдвиг массива с перестановкой в начало чётного числа.
            int num = arr[j];
            for(; j > i; j--)
                arr[j] = arr[j-1];
            arr[i] = num;
        }
    }
}
0
 Аватар для belalugoci
475 / 294 / 29
Регистрация: 01.06.2018
Сообщений: 3,676
15.01.2025, 08:45
Цитата Сообщение от Элд Хасп Посмотреть сообщение
на первый взгляд во всех решениях есть перестановка нечётного числа куда-то в массиве
так если вы меняете местами четные и нечетные то и перестановки у вас будут как четных так и нечетных, моё решение никакой сортировкой не занимается, просто меняет местами четные и нечетные.

Цитата Сообщение от Элд Хасп Посмотреть сообщение
Из всех решений правильный результат
Ответы моего решения правильные, так как полностью соответствуют заданию, то что ответ не совпадает с ПРИМЕРОМ решения, так и задачи нет такой, чтобы ПРИМЕР решения давал результат аналогичный другим решениям, главное же условие задачи чтобы было выполнено.
Цитата Сообщение от Alexander 1345 Посмотреть сообщение
Пример:
Входной массив: {4, 8, 9, 3, 11, 7, 0, 2, 1}
Пример выходного массива: {4, 8, 0, 2, 9, 3, 11, 7, 1}
тут вообще ахинея происходит с результатом, вместо двух перестановок 9 <-> 0 и 3 <-> 2 происходит еще перестановка 11 и 7, за каким лешим это делать? Я понимаю что если сделать 4 операции по изменению самого массива пересоздавая новый, то можно операцией "вставки" переставить 0 и 2, но это действие уже нарушает условие задачи.
Если бы была свобода в решениях, то можно было сделать свой список на указателях и перемещать данные меняя ссылки, но к данной задаче это не относится.

Добавлено через 1 минуту
Цитата Сообщение от Элд Хасп Посмотреть сообщение
// Иначе сдвиг массива с перестановкой в начало чётного числа.
зачем такое ужасное решение?

Добавлено через 3 минуты
Цитата Сообщение от Элд Хасп Посмотреть сообщение
то ясно, что последовательность чисел не должна меняться
нет, это не следует

Добавлено через 7 минут
Цитата Сообщение от Элд Хасп Посмотреть сообщение
// Иначе сдвиг массива с перестановкой в начало чётного числа.
если уж вы хотите решить задачу максимально неоптимально, то можно реализовать простой алгоритм наподобие сортировки пузырьком, то есть каждый раз когда встречаете четное число то меняете его с нечетным до тех пор, пока не встретите четное. Такой подход полностью реализует неприкасаемость порядка следования в массиве и максимально неэффективен так как по сложности будет O(n2).
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,175
Записей в блоге: 2
15.01.2025, 10:59
belalugoci, есть образцовый пример решения указанный в задании:
Цитата Сообщение от Alexander 1345 Посмотреть сообщение
Пример:
Входной массив: {4, 8, 9, 3, 11, 7, 0, 2, 1}
Пример выходного массива: {4, 8, 0, 2, 9, 3, 11, 7, 1}
Ваш вариант получает такой результат?
Если нет, значит ваша реализация не решает задание.
0
 Аватар для belalugoci
475 / 294 / 29
Регистрация: 01.06.2018
Сообщений: 3,676
16.01.2025, 09:26
C#
1
2
3
4
5
6
7
8
9
10
int[] arr = { 4, 8, 9, 3, 11, 7, 0, 2, 1 };
int even = 0, odd = arr.Length - 1;
while (even < odd)
{
    while (arr[even] % 2 == 0) if (++even == arr.Length) goto label1;
    while (arr[odd] % 2 != 0) if (--odd == even) goto label1;
    (arr[odd], arr[even]) = (arr[even--], arr[odd++]);
}
label1:
Console.WriteLine(string.Join(", ", arr));
По всей видимости это оптимальное O(n) решение.
0
 Аватар для Andrey-MSK
3397 / 2283 / 388
Регистрация: 14.08.2018
Сообщений: 7,757
Записей в блоге: 4
16.01.2025, 10:11
Цитата Сообщение от belalugoci Посмотреть сообщение
C#
1
if (++even == arr.Length) goto label1;
C#
1
if (++even == arr.Length) break;
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18402 / 14334 / 5370
Регистрация: 17.03.2014
Сообщений: 29,012
Записей в блоге: 1
16.01.2025, 11:06
Цитата Сообщение от belalugoci Посмотреть сообщение
По всей видимости это оптимальное O(n) решение.
Код падает с IndexOutOfRangeException для массива { 4, 8, 9, 3, 11, 7, 0, 1, 2 } (всего лишь переставил два последних элемента).

Цитата Сообщение от Andrey-MSK Посмотреть сообщение
C#
1
if (++even == arr.Length) break;
В чем смысл такой замены? goto же используется чтобы выйти из двух циклов сразу, что break не умеет.
0
 Аватар для belalugoci
475 / 294 / 29
Регистрация: 01.06.2018
Сообщений: 3,676
16.01.2025, 11:39
Andrey-MSK, там два цикла, нужно выйти из обоих

OwenGlendower, в студии исправлено было, а текст уже был набран, невнимательность
C#
1
2
3
4
5
6
7
8
9
10
int[] arr = { 4, 8, 9, 3, 11, 7, 0, 2, 1 };
int even = 0, odd = arr.Length - 1;
while (even < odd)
{
    while (arr[even] % 2 == 0) if (++even == arr.Length) goto label1;
    while (arr[odd] % 2 != 0) if (--odd == even) goto label1;
    (arr[odd], arr[even]) = (arr[even++], arr[odd--]); // поменял местами -- и ++
}
label1:
Console.WriteLine(string.Join(", ", arr));
0
 Аватар для belalugoci
475 / 294 / 29
Регистрация: 01.06.2018
Сообщений: 3,676
16.01.2025, 11:39
Andrey-MSK, там два цикла, нужно выйти из обоих

OwenGlendower, в студии исправлено было, а текст уже был набран, невнимательность
C#
1
2
3
4
5
6
7
8
9
10
int[] arr = { 4, 8, 9, 3, 11, 7, 0, 2, 1 };
int even = 0, odd = arr.Length - 1;
while (even < odd)
{
    while (arr[even] % 2 == 0) if (++even == arr.Length) goto label1;
    while (arr[odd] % 2 != 0) if (--odd == even) goto label1;
    (arr[odd], arr[even]) = (arr[even++], arr[odd--]); // поменял местами -- и ++
}
label1:
Console.WriteLine(string.Join(", ", arr));
Добавлено через 25 минут
Цитата Сообщение от Элд Хасп Посмотреть сообщение
В задачках на программирование примеры решения даются ОБЯЗАТЕЛЬНО и они являются частью условия задачи.
это ваши фантазии или можете аргументированные данные предоставить? во-первых, в примерах постоянно допускаются ошибки, во-вторых, примеры как раз чаще всего и создают неопределённости и вопросы студентов, эта тема хороший тому пример, в-третьих, раз вы пишете такую чушь, то у вас абсолютно мизерная начитанность по учебникам и задачам.

Цитата Сообщение от Элд Хасп Посмотреть сообщение
Примеры специально подбираются так, чтобы различные решения, часть из которых может сделана по другому толкованию условий задачи и выдавали не требуемый результат, можно было протестировать на этом примере и привести в соответствии с условиями задачи в том толковании, в котором имели её создатели.
Вы не выдавайте свои пожелания за реальность.

Цитата Сообщение от Элд Хасп Посмотреть сообщение
Скорее всего вы никогда даже не пробовали проходить подобные тестовые задачи.
Конечно, писать пишу, но проходить? Зачем? Тот кто пишет - не читает, это логично.

Цитата Сообщение от Элд Хасп Посмотреть сообщение
Вы думает на этих сайтах сидят реальные люди и проверяют предложенные коды?
Я ничего не думаю ни про какие сайты, про сайты мы разговоры вообще не ведём.

Цитата Сообщение от Элд Хасп Посмотреть сообщение
Код запускается в скрипте. На вход подаётся несколько вариантов входных данных. И потом выход сравнивается с образцовым.
это всё жутко интересно (нет), но к нашему разговору не имеет никакого отношения

Цитата Сообщение от Элд Хасп Посмотреть сообщение
Там не то что порядок имеет значение, там даже незначащие нули в числе и то могут считаться неверным ответом, хотя с вашей точки зрения они ни как не меняют логику задания и варианта решения.
вы путаете попу и палец, я вам говорю про условие задачи и решение, а вы мне про особенности какого-то сервера с заданиями. Как только ТС укажет в теме что эта задача есть на сервере Х и наши решения не проходят валидацию, то мы безусловно примем это к сведению, а пока вы просто фантазируете.
0
 Аватар для Andrey-MSK
3397 / 2283 / 388
Регистрация: 14.08.2018
Сообщений: 7,757
Записей в блоге: 4
16.01.2025, 16:27
Можно и без goto выйти из циклов
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
int[] arr = { 4, 8, 9, 3, 11, 7, 0, 2, 1 };
int even = 0, odd = arr.Length - 1;
 
try
{
    while (even < odd)
    {
        while (arr[even] % 2 == 0) if (++even == arr.Length) throw new Exception("Цикл закончен");
        while (arr[odd] % 2 != 0) if (--odd == even) throw new Exception("Цикл закончен");
        (arr[odd], arr[even]) = (arr[even++], arr[odd--]); // поменял местами -- и ++
    }
}
catch (Exception ex)
{
    Console.WriteLine(string.Join(", ", arr));
}
Ну кому как
0
Любознательный
 Аватар для YuS_2
7407 / 2260 / 361
Регистрация: 10.03.2016
Сообщений: 5,216
16.01.2025, 22:24
а зачем столько циклов?
можно же проще сделать...
PowerShell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
$arr = [collections.generic.list[int]]@(4, 8, 9, 3, 11, 7, 0, 2, 1)
$len = $arr.count
$i,$j = 0,0
while($i -lt $len){
    if ($arr[$j]%2 -ne 0){
        $tmp = $arr[$j]
        $arr.removeat($j)
        $arr.add($tmp)
        $j--
    }
    $j++
    $i++
}
$arr
Сорри, что не C#, а powershell, но соображать на перевод очень лениво... но идея, наверное понятна.
0
 Аватар для belalugoci
475 / 294 / 29
Регистрация: 01.06.2018
Сообщений: 3,676
17.01.2025, 08:28
Цитата Сообщение от YuS_2 Посмотреть сообщение
можно же проще сделать
ну работать это будет сильно медленнее, удаление и добавление в массив будут создавать новый массив, это же выстрел себе в ногу.

Цитата Сообщение от Andrey-MSK Посмотреть сообщение
Можно и без goto выйти из циклов
можно просто иначе написать сам код:
C#
1
2
3
4
5
6
7
8
9
while (even < odd)
{
    count++;
    while (arr[even] % 2 == 0 && ++even < arr.Length) ;
    if (even == arr.Length) break;
    while (arr[odd] % 2 != 0 && --odd > even) ;
    if (odd == even) break;
    (arr[odd], arr[even]) = (arr[even++], arr[odd--]);
}
но мне не нравится, у меня нет аллергии на goto, а тут лишняя проверка делается, фуфу )))
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18402 / 14334 / 5370
Регистрация: 17.03.2014
Сообщений: 29,012
Записей в блоге: 1
17.01.2025, 08:36
Цитата Сообщение от belalugoci Посмотреть сообщение
удаление и добавление в массив будут создавать новый массив
В данном случае новые массивы не будут создаваться т.к. количество элементов не меняется.

Цитата Сообщение от belalugoci Посмотреть сообщение
работать это будет сильно медленнее
С этим согласен, но по другой причине - из-за необходимости двигать блоки элементов при удалении.
0
 Аватар для belalugoci
475 / 294 / 29
Регистрация: 01.06.2018
Сообщений: 3,676
17.01.2025, 09:01
Цитата Сообщение от OwenGlendower Посмотреть сообщение
В данном случае новые массивы не будут создаваться т.к. количество элементов не меняется.
сначала удаление - создастся новый массив, потом добавление - создастся еще один массив
Цитата Сообщение от YuS_2 Посмотреть сообщение
$arr.removeat($j)
        $arr.add($tmp)
Добавлено через 1 минуту
Цитата Сообщение от OwenGlendower Посмотреть сообщение
из-за необходимости двигать блоки элементов при удалении
зачем? создаётся новый массив из двух частей старого
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18402 / 14334 / 5370
Регистрация: 17.03.2014
Сообщений: 29,012
Записей в блоге: 1
17.01.2025, 09:42
belalugoci, в коде YuS_2 используется List<int>, а не массив (это кстати противоречит правилам задания где сказано про массив). Данный класс написан так чтобы минимизировать выделения памяти. Поэтому RemoveAt не создает новый массив, а двигает данные в существующем. Метод Add создаст новый массив только если не хватает места в существующем, но это не наш случай. Если не верите на слово, то смотрите его исходный код.
Кликните здесь для просмотра всего текста
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
        // Removes the element at the given index. The size of the list is
        // decreased by one.
        public void RemoveAt(int index)
        {
            if ((uint)index >= (uint)_size)
            {
                ThrowHelper.ThrowArgumentOutOfRange_IndexMustBeLessException();
            }
            _size--;
            if (index < _size)
            {
                Array.Copy(_items, index + 1, _items, index, _size - index);
            }
            if (RuntimeHelpers.IsReferenceOrContainsReferences<T>())
            {
                _items[_size] = default!;
            }
            _version++;
        }
 
        // Adds the given object to the end of this list. The size of the list is
        // increased by one. If required, the capacity of the list is doubled
        // before adding the new element.
        //
        [MethodImpl(MethodImplOptions.AggressiveInlining)]
        public void Add(T item)
        {
            _version++;
            T[] array = _items;
            int size = _size;
            if ((uint)size < (uint)array.Length)
            {
                _size = size + 1;
                array[size] = item;
            }
            else
            {
                AddWithResize(item);
            }
        }
0
 Аватар для belalugoci
475 / 294 / 29
Регистрация: 01.06.2018
Сообщений: 3,676
17.01.2025, 09:59
Цитата Сообщение от OwenGlendower Посмотреть сообщение
в коде YuS_2 используется List<int>
ага, увидел

Цитата Сообщение от OwenGlendower Посмотреть сообщение
это кстати противоречит правилам задания где сказано про массив
ну я изначально об этом и написал, я в PS слаб, поэтому не стал вглядываться, поэтому сделал конвертацию операций в эквивалент массиву

Цитата Сообщение от OwenGlendower Посмотреть сообщение
Если не верите на слово
да мне не нужно объяснять про списки, разговор же про эквивалент в виде массива. В задании списков нет.

YuS_2, почитал код, переписал вот так, так и не понял зачем у вас $i используется:
PowerShell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
$arr = [collections.generic.list[int]]@(4, 8, 9, 3, 11, 7, 0, 2, 1)
$len = $arr.count
$j = 0 # убрал $i
while($j -lt $len){
    if ($arr[$j]%2 -ne 0){
        $tmp = $arr[$j]
        $arr.removeat($j)
        $arr.add($tmp)
        $len-- # нет смысла бежать по тем элементам которые были уже обработаны
        $j--
    }
    $j++
}
$arr
Добавлено через 6 минут
YuS_2, ну и вот так наверное еще
PowerShell
1
2
3
4
5
6
7
8
9
10
11
12
13
$arr = [collections.generic.list[int]]@(4, 8, 9, 3, 11, 7, 0, 2, 1)
$len = $arr.count
$j = 0
while($j -lt $len){
    if ($arr[$j]%2 -ne 0){
        $tmp = $arr[$j]
        $arr.removeat($j)
        $arr.add($tmp)
        $len--
    }
    else { $j++ }
}
$arr
0
 Аватар для Doomov
1056 / 335 / 119
Регистрация: 28.11.2020
Сообщений: 1,066
17.01.2025, 10:44
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Сортировать числа не нужно, а то что вы делаете это не сортировка, но тем не менее, если посмотреть решение примера в задании, то ясно, что последовательность чисел не должна меняться
согласен...
Цитата Сообщение от OwenGlendower Посмотреть сообщение
В задании сказано:
Необходимо, чтобы функция переставила данные в ячейках так, чтобы вначале шли четные числа, а потом нечетные.
Сортировать числа не нужно.
Ограничение: не используйте вспомогательный массив.
из возможных решений привёл еще раз, но с правкой...
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
    int[] arr = [ 4, 8, 9, 3, 11, 7, 0, 2, 1];
 
    Console.WriteLine (String.Join (", ", arr));
    for (int i = 0; i < arr.Length - 1; i++)
    {
        for (int j = 0; j < arr.Length - 1 - i; j++)
        {
            // Сравниваем и меняем местами нечетные и четные
            bool currentIsOdd = arr [j] % 2 == 0;
            bool nextIsOdd = arr [j + 1] % 2 == 0;
 
            // Поменять местами, если текущий элемент четный, а следующий нечетный,
            // или если оба нечетные и текущий больше следующего
            //  || (currentIsOdd && nextIsOdd && arr [j] > arr [j + 1])
            if (!currentIsOdd && nextIsOdd) // надо было убрать условие ИЛИ, о чём, как всегда, забыл ;) 
            {
                (arr [j], arr [j + 1]) = (arr [j + 1], arr [j]);
            }
 
            // Отсортировать нечетные элементы '<': в порядке убывания (> - возрастания)
            if (!currentIsOdd && !nextIsOdd && arr [j] < arr [j + 1])
            {
                (arr [j], arr [j + 1]) = (arr [j + 1], arr [j]);
            }
        }
    }
 
    // Выводим отсортированный массив
    Console.WriteLine (String.Join (", ", arr));
Я только потерял нить спора на три страницы: вкратце объясните, а то так и будем "мериться" кто больше преподовал или знает
1
 Аватар для Doomov
1056 / 335 / 119
Регистрация: 28.11.2020
Сообщений: 1,066
17.01.2025, 11:11
Цитата Сообщение от Doomov Посмотреть сообщение
// Отсортировать нечетные элементы '<': в порядке убывания (> - возрастания)
Еще одна ошибка, данный пункт в моём коде не нужен.
То есть конечный вариант...
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
    int[] arr = [ 4, 8, 9, 3, 11, 7, 0, 2, 1];
 
    Console.WriteLine (String.Join (", ", arr));
    for (int i = 0; i < arr.Length - 1; i++)
    {
        for (int j = 0; j < arr.Length - 1 - i; j++)
        {
            // Сравниваем и меняем местами нечетные и четные
            bool currentIsOdd = arr [j] % 2 == 0;
            bool nextIsOdd = arr [j + 1] % 2 == 0;
 
            // Поменять местами, если текущий элемент четный, а следующий нечетный,
            // или если оба нечетные и текущий больше следующего
            //  || (currentIsOdd && nextIsOdd && arr [j] > arr [j + 1])
            if (!currentIsOdd && nextIsOdd) // надо было убрать условие ИЛИ, о чём, как всегда, забыл ;) 
            {
                (arr [j], arr [j + 1]) = (arr [j + 1], arr [j]);
            }
        }
    }
 
    // Выводим отсортированный массив
    Console.WriteLine (String.Join (", ", arr));
Прошу прощение

Добавлено через 6 минут
Цитата Сообщение от YuS_2 Посмотреть сообщение
Сорри, что не C#, а powershell, но
Забыл спросить, а вариант для массива (как по заданию) сделать сможешь?
0
 Аватар для Doomov
1056 / 335 / 119
Регистрация: 28.11.2020
Сообщений: 1,066
17.01.2025, 12:25
Цитата Сообщение от belalugoci Посмотреть сообщение
O(n2)
ладно...
Вот вариант сложности O(n)...
Метод...
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
static void PartitionEvenOdd (ref int[] arr)
{
    int n = arr.Length;
    int evenIndex = 0; // Указатель для чётных чисел
 
    // Проходим по массиву
    for (int i = 0; i < n; i++)
    {
        // Если текущий элемент чётный, меняем его местами с элементом на позиции evenIndex
        if (arr [i] % 2 == 0)
        {
            // Меняем местами элементы
            (arr [i], arr [evenIndex]) = (arr [evenIndex], arr [i]);
            evenIndex++; // Сдвигаем указатель для чётных чисел
        }
    }
}
Временная сложность: ( O(n) ), так как мы проходим массив ровно один раз.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
17.01.2025, 12:25

Сортировка массива так, чтобы вначале шли четные числа, а потом нечетные
На вход функции подается заполненный одномерный массив типа integer. Необходимо, чтобы функция переставила данные в ячейках так, чтобы...

Создать массив N и сделать так, чтобы сначала шли четные, а потом нечетные числа
Создать массив N и сделать так, чтобы сначала шли четные, а потом нечетные числа Нельзя создавать второй массив, всю работу надо...

Переписать компоненты файла f в файл g так, чтобы в файле g сначала шли нечетные потом четные числа
Есть задача, я написал код, в котором создается файл, и вписываются значения, но не могу понять как сделать вторую часть задачи, помогите...

Используя вспомогательный файл, переписать компоненты f так, чтобы в файле сначала шли нечетные, потом четные числа
Здравствуйте. Помогите реализовать алгоритм решения задачи. Дан файл f, компоненты которого являются целыми числами. Никакая из...

Преобразовать ряд так, чтобы сперва шли четные значения, а потом нечетные
Дан целочисленный ряд А. Построить целочисленный ряд в, в котором сначала расположены значения компонент массива А с четными значениями а...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru