С++. Как отсортировать массив, что бы сначала шли отрицательные числа на убывание, потом положительные числа на убывание?

Мне дано массив из 20 рандомных элементов, значение которых от -100 до 100.
Требуется отсортировать массив так, что бы сначала шли отрицательные элементы на убывание, потом положительные, так же на убывание. При чём очень желательно не использовать встроенные методы сортировки. Также требуется использовать для создания массива свою функцию, а для сортировки - свою. В main() нужно только вывести результаты.
Пробовал некоторые способы, но программа просто вылетала, даже описывать их нет смысла.
Вот код для обычной сортировки по убыванию. Сделано в Qt Creator

#include <QtCore/QCoreApplication>
#include <iostream>
#include <ctime>
#include <stdlib.h>
using namespace std;

void crArr1(int mas[], int &size);
void masPrint(int *mas, int &size);
void sortArr1(int mas[], int &size);
void masSortPrint(int *mas, int &size);

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    int size;
    int *mas;
    masPrint(mas, size);
    masSortPrint(mas, size);
    return a.exec();
}

void crArr1(int mas[], int &size){
    size = 20;
    int i = 0;
    srand(time(NULL));
    for(i=0; i<size; i++){
        mas[i] = rand()%201-100;
    }
}

void masPrint(int *mas, int &size){
    crArr1(mas, size);
    cout <<"\nFirst random array:"<<endl;
    for(int i=0; i<size; i++){
        cout << mas[i];
        if(i<size-1) cout <<" ";
    }
    cout <<endl;
}

void sortArr1(int mas[], int &size){
    size = 20;
    for (int i=0; i<size-1; i++){
        int smInd = i;
        for(int j=i+1; j<size; j++){
            if(mas[j] > mas[smInd])
                smInd = j;
        }
        int tmp = mas[i];
        mas[i] = mas[smInd];
        mas[smInd] = tmp;
    }
}

void masSortPrint(int *mas, int &size){
    sortArr1(mas, size);
    cout << "\nDescending sorted array:"<<endl;
    for (int index=0; index < size; index++)
        cout << mas[index] << ' ';
    cout <<endl;
}

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

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

Итак, у вас сделана сортировка выбором. Принцип упорядочения задаётся здесь:

if(mas[j] > mas[smInd]) 

Как его надо изменить?
Если оба числа положительные, то менять ничего не надо.
Если оба отрицательные, то тоже ничего менять не надо.
А вот если знаки разные, то результат сравнения должен быть обратным.

Раз диапазон значений ограничен, то умножение не вызовет переполнения, и мы можем записать

if(mas[j] * mas[smInd] * (mas[j] - mas[smInd]) > 0) 
→ Ссылка