Отсортировать массив так, что бы сначала шли элементы с парными номерами, а в конце с непарными с помощью цикла while

Нужно отсортировать массив таким образом, чтобы в первой его половине расположились элементы, которые стоят на четных позициях, а в другой половине - элементы, что стоят в нечетных позициях. Реализовать только с циклом while. Вот код, но он не правильно сортирует, не знаю в чем проблема.

#include <iostream>
#include <stdlib.h>
#include <cmath>
#include <conio.h>
#include <time.h>
#include <windows.h>
#include <stdio.h>

using namespace std;

int main()
{
    setlocale(LC_ALL, "rus");
    HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);

    int stime, ltime;
    ltime = time(NULL);
    stime = (unsigned int)ltime / 2;
    srand(stime);

    const int maxsize = 50;
    int i = 0;
    int a[50], realsize, b = -5, c = 0, d, e = 0;

    int as[maxsize];
    b = 0;

    SetConsoleTextAttribute(handle, 3);
    cout << ("Задайте размеры массива (целое число не больше 50-ти): ");
    cin >> realsize;

    if (realsize > maxsize)
    {
        SetConsoleTextAttribute(handle, 4);
        cout << ("\n\nВы ввели некорректное значение.");

        cout << ("\n\n");
        system("pause");
        return 2;
    }

    SetConsoleTextAttribute(handle, 3);
    cout << ("\nВаш массив: \n");

    i = 0;
    while (i < realsize)
    {
        a[i] = rand() % 15 - 5;
        SetConsoleTextAttribute(handle, 7);
        cout << a[i] << (" ");
        i++;
    }

    i = 0;
    while (i < realsize)
    {
        as[i] = a[i];
        i++;
    }

    i = 0;
    while (i < realsize)
    {
        a[b] = as[i];
        b++;
        i += 2;
    }

    i = 1;
    while (i < realsize)
    {
        a[c] = as[i];
        c++;
        i += 2;
    }

    SetConsoleTextAttribute(handle, 3);
    cout << ("\n\nГотово. Ваш отсортированный массив: \n");

    for (int i = 0; i <= realsize; i++)
    {
        SetConsoleTextAttribute(handle, 7);
        cout << a[i] << (" ");
    }

    cout << ("\n\n");
    SetConsoleTextAttribute(handle, 3);
    system("pause");
    return 1;
}

Я пытался сделать с условием, чтобы проверяло каждый элемент массива на четность/нечетность, но так и не смог реализовать эту идею до конца, поэтому решил проходится по массиву без условию (последние два цикла while). Если есть ошибка, укажите где, или просто можно поставить крест на задании и искать другое решение?


Ответы (1 шт):

Автор решения: Harry

Так годится?

void rearrange(int a[], int n)
{
    if (n%2) n++;
    int k = 1, m = n/2;
    if (m%2) ++m;
    while(k < n/2)
    {
        int t = a[k];
        a[k] = a[m];
        a[m] = t;
        k+=2; m+=2;
    }
}

Вот пример полной программы: https://ideone.com/Hcvk7l

Напомню: устойчивость, по вашим словам, не обязательна.

→ Ссылка