Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.12.2024, 16:13   #11
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,427
По умолчанию

Тогда можно без дополнительного массива просто сортировать исходный массив:
Код:
void segregateEvenOdd(int *array, const int size)
{
    for (int i = 0; i < size - 1; ++i)
        for (int j = i + 1; j < size; ++j)
            if (
                (array[i] % 2 == 0 && array[j] % 2 != 0) ||
                (array[i] % 2 == array[j] % 2 && array[i] > array[j])
            )
            {
                int v = array[i];
                array[i] = array[j];
                array[j] = v;
            }
}
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 22.12.2024, 17:14   #12
vovamakarovych
Пользователь
 
Регистрация: 09.04.2019
Сообщений: 50
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
Из такого примера может следовать не сортировка, а наоборот сохранение порядка следования чисел из исходного массива.
Я еще заметил, что у меня при каждом запуске программы одни и те же значения генерирует програма. Неужели std::rand не достаточно, чтобы рандомные значения всегда записывались?
vovamakarovych вне форума Ответить с цитированием
Старый 22.12.2024, 17:20   #13
vovamakarovych
Пользователь
 
Регистрация: 09.04.2019
Сообщений: 50
По умолчанию

нашел и додал std::srand(std::time(nullptr));
vovamakarovych вне форума Ответить с цитированием
Старый 23.12.2024, 07:13   #14
Алексей1153
фрилансер, препод.
Участник клуба
 
Регистрация: 11.10.2019
Сообщений: 1,035
По умолчанию

vovamakarovych, если вдруг интересно, есть вот такая замечательная функция std::stable_partition

Код:
#include <iostream>
#include <algorithm>

int main()
{
    int A[]{1, 4, 5, 8, 9};
    
    std::stable_partition(std::begin(A),std::end(A),[](auto& i){return i%2;});
    
    for(auto& i:A){std::cout<<i<<',';}
}
Код:
1,5,9,4,8,
Алексей1153 вне форума Ответить с цитированием
Старый 27.12.2024, 12:25   #15
vovamakarovych
Пользователь
 
Регистрация: 09.04.2019
Сообщений: 50
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
[CODE]
Удалять надо оба массива и в конце работы программы, а не в функции segregateEvenOdd. Вы уверены, что требуется сортировка, а не только разделение на четные и нечетные?
Мне все таки нужно сделать не сортировку а разделение на четные и не четные , но чтобы они ишли как в стартовом масиве. Например: стартовый массив- 3 6 9 12 2 15 23 26 41 55
Масив который я вывожу на екран- 3 9 15 23 41 55 6 12 2 26 . Я переделал функцию, она выводит четные и нечетные но не так как нужно.

Мой код:
Код:
int* segregateEvenOdd(int* array, const size_t size) 
{
    for (size_t i = 0; i < size - 1; ++i) 
    {
        if (array[i] % 2 != 0) 
        {
            continue;
            ++i;
        }
        
            for (size_t j = i + 1; j < size; ++j)
            {
                if (array[j] % 2 != 0)

                    std::swap(array[i], array[j]);
            }   
    }
    return array;
}

int main()
{
    size_t size = 10;
    int* array = new int8_t[size];
    std::srand(std::time(nullptr));

    std::cout << "Before:" << std::endl;
    for (int i = 0; i < size; ++i)
    {
        array[i] = std::rand() % 100;
        std::cout << static_cast<int>(array[i]) << " ";
    }
    std::cout << std::endl;

    array = segregateEvenOdd(array, size);
    std::cout << "After:" << std::endl;
    for (int i = 0; i < size; ++i)
    {
        std::cout << static_cast<int>(array[i]) << " ";
    }
    std::cout << std::endl;

    delete[] array;

    return 0;
}
Вывод:
Before:
62 8 67 93 13 38 99 58 43 41
After:
41 43 99 13 93 67 8 58 62 38
vovamakarovych вне форума Ответить с цитированием
Старый 27.12.2024, 13:13   #16
сфинкс
Участник клуба
 
Аватар для сфинкс
 
Регистрация: 17.06.2012
Сообщений: 1,024
По умолчанию

5 минут ... 5 минут ... и готово
на языке высочайшего уровня qbasic qb64
и далее переделываем сами на функции и на др.яз

Уникальная идея: смотрим массив справа и слева
да-да как в моём уникальном алгоритме

Код:
N = 8: Randomize Timer ' prlev.bas
Dim d(N), a(N)
For i = 1 To N: d(i) = Int(Rnd * 88)+10: Print d(i);: Next: Print

k = 1: m = N: For i = 1 To N
    If Int(d(i) / 2) <> d(i) / 2 Then a(k) = d(i): k = k+1
    If Int(d(N-i+1) / 2) = d(N-i+1) / 2 Then a(m) = d(N-i+1): m = m-1
Next

Print: For i = 1 To N: Print a(i);: Next
59 53 18 54 36 81 82 64
59 53 81 18 54 36 82 64



Попробую проверить онлайн и возможно добавлю ссылку
Случайные и Массивы https://programmersforum.ru/showthread.php?t=344371 Учим C# & basic & excel & python https://programmersforum.ru/showthre...=327446&page=5 ничего нерекомендую

Последний раз редактировалось сфинкс; 27.12.2024 в 13:40.
сфинкс вне форума Ответить с цитированием
Старый 27.12.2024, 13:50   #17
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,427
По умолчанию

Цитата:
Сообщение от vovamakarovych Посмотреть сообщение
Мне все таки нужно сделать не сортировку а разделение на четные и не четные , но чтобы они ишли как в стартовом масиве.
Тогда возвращайтесь к предыдущей реализации, когда в новый массив переписывались сначала нечетные, а потом четные из исходного массива.
Или вот такая "наивная" реализация без дополнительного массива:
Код:
void segregateEvenOdd(int* array, const size_t size) 
{
    for (size_t i = 0; i < size - 1; ++i) 
    {
        if (array[i] % 2 != 0) 
            continue;
        
        size_t j = i + 1;
        while (j < size && array[j] % 2 == 0)
            ++j;
        if (j == size)
            break;
        
        int v = array[j];
        for (size_t k = j; k > i; --k)
            array[k] = array[k - 1];
        array[i] = v;
    }
}
Четные сдвигаются "блоками" вправо, а нечетные по одному переносятся влево.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )

Последний раз редактировалось BDA; 27.12.2024 в 14:07.
BDA вне форума Ответить с цитированием
Старый 27.12.2024, 15:45   #18
vovamakarovych
Пользователь
 
Регистрация: 09.04.2019
Сообщений: 50
По умолчанию

еще такой вопрос
если я создаю в стек массив
Код:
const size_t size = 10;
int array[size];
на array куда я записываю результат функции кричит
Код:
 array = segregateEvenOdd(array, size);
как мне тут передавать?
vovamakarovych вне форума Ответить с цитированием
Старый 27.12.2024, 18:11   #19
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,427
По умолчанию

Тонкости не объясню. Просто не возвращайте ничего из функции, вы же все равно меняете содержимое массива, а не новый массив формируете.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 27.12.2024, 19:24   #20
Алексей1153
фрилансер, препод.
Участник клуба
 
Регистрация: 11.10.2019
Сообщений: 1,035
По умолчанию

vovamakarovych, у массива нет оператора копирования
Алексей1153 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Не работает функция которая должна с json формата возвращать в стандартный dimaSlon Qt и кроссплатформенное программирование С/С++ 76 08.06.2018 17:35
На С++ написать программу с реализацией в виде вызова функции по ссылке: Функция должна вернуть не одно, а ДВА(или более) значения Raitek Помощь студентам 2 23.01.2015 07:41
Функция, сортирующая сначала нечетные числа в массиве по возрастанию, а потом четные по убыванию. yurets17 Помощь студентам 1 12.11.2013 19:01
Вывести сначала все его четные (нечетные) елементы, а потом- нечетные(четные). tondo Помощь студентам 4 25.04.2012 00:17
Паскаль, вывести строки массива, поочередно, с лево на право, справа на лево Amid1990 Помощь студентам 2 15.11.2010 13:00