Сортировка по возрастанию наименьшего кратного числа

Мне нужно отсортировать массив по возрастанию наименьшего кратного. Должно быть так (1 2 4 100 3 15 29..) Т.е 1 всегда будет слева, далее идут цифры которые кратные 2-м(2,4,100), потом цифры которые кратные 3-м(3,15) и число 29 должно находится в правой части т.к оно делится только на 29 и т.д. Я не могу понять как сделать такую сортировку. Как мне с начало проверить числа которые кратные 2-м а потом кратные 3-м и т.д?? Буду благодарен если хотя-бы подскажите как это реализовать!


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

Автор решения: Alex Guteniev

В лоб решение -- написать функцию, определяющую для каждого числа наименьший простой множитель, и использовать её в предикате для сортировки (функтор std::sort).

Не в лоб, но с меньшей сложностью -- перебирая простые множители, переставлять (через std::swap) в начало массива числа, на них дделящиеся, а остальные оставлять в конце; на каждом следующем проходе брать индекс или итератор с учётом предыдущего шага так, чтобы ичключить числа, уже находящиеся на своём месте.

Простые числа можно получать тут же по ходу решетом Эратосфена, можно заранее, можно и не получать (брать все числа подряд, алгоритм просто не сработает для составных).

→ Ссылка
Автор решения: Harry
int mdiv(int n)
{
    if (n%2 == 0) return 2;
    for(unsigned int i = 3; i*i <= n; i+=2)
        if (n%i == 0) return i;
    return n;
}

....

sort(begin(array),end(array),
           [](int a, int b){ int m = mdiv(a), n = mdiv(b);
           return m < n ? true : m > n ? false : a < b; });

Полный код - https://ideone.com/6CGsFf

→ Ссылка