Сортировка четных и нечетных элементов c++

336
20 июня 2019, 05:00

Есть задача: В одномерном массиве, состоящем из n вещественных элементов, вычислить:

  1. произведение положительных элементов массива;
  2. сумму элементов массива, расположенных до минимального элемента.
  3. упорядочить по возрастанию отдельно элементы, стоящие на четных местах, и элементы, стоящие на нечетных местах.

Я сделал все 3 пункта, но работает все кроме упорядовачивания, не могли бы подсказать, в чем проблема?

#include "pch.h"
#include <iostream> //ввод, вывод cout<< cin>>
#include <iomanip> //расшириные функции <iostream>
#include <cstdlib> //преобразование типов
#include <math.h> //стандартные функции
#include <ctime> //пауза
#include <locale.h> //русский язык

using namespace std;
int main() {
    setlocale(LC_ALL, "Russian");
    int i, n, imin = 0, a = 0, b = 0;
    double sum = 0, proizv = 1, min = 0, c = 0;
    double sort = 1;
    cout << ("Введите количество эллементов массива: ");
    cin >> n;  //ввод размерности массива
    cout << ("Введите элементы массива:") << endl << endl;
    double* p = new double[n]; // объявление массива
    double* p1 = new double[n]; //объявление массива четных позиций
    double* p2 = new double[n]; //объявление массива нечетных позиций
    for (i = 0; i < n; i++)
        cin >> p[i]; //ввод массива
    for (i = 0; i < n; i++)
        if (p[i] > 0) {
            proizv *= p[i];//произведение положительных элементов
        }
    cout << ("Произведение положительных элементов: ") << proizv << endl; //вывод
    min = p[0];      //берем 1 элемент за минимальный
    for (i = 0; i < n; i++)    //поиск
        if (p[i] < min)       //минимального
        {                    //элемента
            min = p[i];
            imin = i;       //номер мин элемента
        }
    for (i = 0; i < imin; i++)sum += p[i];//суммирование
    cout << ("Сумма элементов расположенных до минимального: ") << sum << endl;//вывод суммы
    cout << ("Преобразованный массив:") << endl;
    for (i = 0; i < n; i++) {                   //поиск элементов четных позиций
        if ((i % 2) == false)  //деление на 2
        {
            p1[a] = p[i];
            a++;
        }
        if (i % 2)           //поиск элементов нечетных позиций
        {
            p2[b] = p[i];
        }
    }
    while (sort) {
        sort = 0;
        for (i = 0; i < a - 1; i++)      //сортировка четных
        {
            if (p1[i] > p1[i + 1]) {
                c = p1[i];
                p1[i] = p1[i + 1];
                p1[i + 1] = c;
                sort = 1;
            }
        }
        sort = 0;
        for (i = 0; i < b - 1; i++)     //сортировка нечетных
        {
            if (p2[i] > p2[i + 1]) {
                c = p2[i];
                p2[i] = p2[i + 1];
                p2[i + 1] = c;
                sort = 1;
            }
        }
    }
    for (i = 0; i < a; i++)cout << p1[i] << ' ';//вывод отсортированных четных элементов
    cout << endl;
    for (i = 0; i < b; i++)cout << p2[i] << ' ';//вывод отсортированных нечетных элементов
    system("pause");
    return 0;
}
Answer 1

В коде, где вы делите массив на четные и нечетные элементы, вы забыли увеличивать счетчик b

if (i % 2)
{
    p2[b] = p[i];
    b++; // !!
}

Кстати эти два условия можно объединить в следующую конструкцию:

if (i % 2)
{
    // нечетная позиция
    // ...
}
else
{
    // четная позиция
    // ...
}

Этот способ избавит от лишнего условия и улучшит читаемость кода.

Кроме прочего, вы забываете удалять выделенную динамически память. Использование выражений new/new[] требует зеркального использования выражений delete/delete[]. Добавьте в конце функции main:

delete[] p;
delete[] p1;
delete[] p2;
READ ALSO
Можно ли объявить функцию main как noexcept?

Можно ли объявить функцию main как noexcept?

Можно ли объявить функцию main как noexcept?

133
Разделить строку на слова в c++

Разделить строку на слова в c++

Доброго времени суток!

90
Выравнивание std140 для unform-блоков в шейдерах (OpenGL, GLSL)

Выравнивание std140 для unform-блоков в шейдерах (OpenGL, GLSL)

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

99
Сумма элементов массива между первым и вторым отрицательными элементами

Сумма элементов массива между первым и вторым отрицательными элементами

Всем доброго времени суток! Хотел бы попросить вас о помощиНе могу понять, как сделать следующее задание

127