10. Сортиране чрез трансформация [3.2]

** Сортиране чрез множество [3.2.1]
    Дадено е множество M от числа в затворения интервал [a, b] и инективна функция за нареждане f: M -> [a, b], т.е. ако x
1 и x2 са различни, то са различни и f (x1) и f (x2).
    Построяваме нулев масив S с индекси от
a до b и с едно минаване през множеството M поставяме стойности 1 на S[f (x)] за всяко x от M.  След това минаваме през масива S за да подредим елементите на M.
    
Сложност O(m+n), където n е броят на елементите на M, а m = b - a + 1.

** Сортиране чрез броене [3.2.2]

** Побитово сортиране [3.2.3]

** Метод на бройните системи [3.2.4]

** Сортиране чрез пермутация [3.2.5]

   Дадено е множество M от n елементи. Означаваме с S множеството {1, 2, 3, ..., n}.  Функцията за нареждане е f: S -> S е сюрективна, т.е. ако x1 и x2 са различни, то са различни и f (x1) и f (x2) и за всяко y от S съществува x от S такова, че y = f (x).
    Разменяме m[1] с m[m[1]] докато на 1-во място не дойде 1. После по същия начин с втория елемент и т.н.
позиции 1234567
        4375612
        5374612
        6374512
       
1374562
        1734562
       
1234567
Броят на размените не недвишава n, а броят на сравненията - 2n.

Задача 10a. Дадено е голямо цяло положително число, като броят на цифрите му е по-малък от 100000. С размяна на различни цифри на числото получаваме друго число, което е или по-малко, или по-голямо от даденото. Да се намери най-голямото число, което може да се получи чрез размяна на произволен брой цифри.
    Да се напише програма, която да чете от стандартния вход голямо число и да извежда на стандартния изход най-голямото число, получено по описания начин.  

    Пример (с по-малко число :)
12002

    Решение на примера:
22100


Задача 10b. Да се напише програма, която намира първия неповтарящ се символ в даден низ.