Сортировка четных и нечётных чисел в массиве по возрастанию и убыванию

126
06 декабря 2019, 21:40

Доброго времени суток всем! Нужно в введённом пользователем массиве отсортировать числа так, чтобы сначала шли чётные числа по возрастанию, а за ними нечётные по убыванию. Входные числа должны быть от 2 до 10000. Проблема такова: Если ввести первое число нечётное, то оно так и будет на выходе стоять первым( хотя должно быть чётное ). Вторым числом зачастую ставится ноль. В общем, проблема состоит в первых двух числах на выходе. `

#include <iostream>
using namespace std;
int main() {
    setlocale (LC_ALL, "Russian");
    int n;
    tryAgain:
    cout <<"Введите число от 2 до 10000"<<endl; cin >> n;
if(n>=2 && n<=10000){
    int *arr=new int[n];
    for(int i=0;i<n;i++)
        cin >> arr[i];
    for (int i=n; i>0; i--)    
        for (int j=n; j>1; j--)
            if(arr[j]%2==0 && arr[j-1]!=0)
                swap(arr[j], arr[j-1]);
    cout<<endl;
    for (int i=0; i<n; i++)
        cout<<arr[i];
    cout<<endl;         
    for (int i=0; i<n; i++)
        for(int j=0;j<n-1;j++)
            if(arr[j]%2!=0 && arr[j+1]%2!=0){           
                if(arr[j]<arr[j+1])
                    swap(arr[j], arr[j+1]);
            }else if((arr[j]%2==0 || arr[j]==0) && (arr[j+1]%2==0 || arr[j+1]==0))
                if(arr[j]>arr[j+1])
                    swap(arr[j], arr[j+1]);
    cout<<endl;     
    for (int i=0; i<n; i++)
        cout<<arr[i]<<" ";

} else goto tryAgain;
    return 0;
}

`

Answer 1

А если воспользоваться sort с соответствующим компаратором?

#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;
bool comp(int l, int r)
{
    if (l%2 < r%2) return true;
    if (l%2 > r%2) return false;
    if (l%2 == 0 && r%2 == 0) return l < r;
    if (l%2 == 1 && r%2 == 1) return l > r;
    return false;
}
int main(int argc, const char * argv[])
{
    vector<int> v;
    for(int i = 0; i < 400 ; ++i)
        v.push_back(rand()%10000);
    sort(v.begin(),v.end(),comp);
    for(auto i: v) cout << i << " "; cout << endl;
}

Если самому надо писать - опять же, воспользуйтесь этим компаратором и не мучьтесь...

READ ALSO
Ввод данных с клавиатуры без нажатия Enter

Ввод данных с клавиатуры без нажатия Enter

Как можно сделать так,дабы символ в консольке считывался сразу после ввода,без нажатия Enter?Не хочу пользоваться _getch,ибо приходится подключать...

106
Как можно исправить? [закрыт]

Как можно исправить? [закрыт]

Want to improve this question? Update the question so it's on-topic for Stack Overflow на русском

123
Упаковка ресурсов в CLion

Упаковка ресурсов в CLion

В Visual Studio при разработке проектов на winapi есть возможность упаковки ресурсов через файлrc

121
C++, функции-члены, указатели на функции

C++, функции-члены, указатели на функции

Всем доброго времени сутокВозможно глупый вопрос, но: Есть класс Manager

103