# -*- coding: utf-8 -*-


class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def __repr__(self):
        return '【' + self.name + ', ' + str(self.age) + '】'


def insert_sort(sortable, sort_by):
    assert type(sortable) is list

    for i in range(len(sortable)):
        inserted = sortable[i]
        j = i - 1
        while j >= 0 and getattr(sortable[j], sort_by) >= getattr(inserted, sort_by):
            sortable[j + 1] = sortable[j]
            j -= 1

        sortable[j + 1] = inserted

        print(sortable)


def select_sort(sortable, sort_by):
    assert type(sortable) is list

    n = len(sortable)
    for i in range(n - 1):
        min_index = i
        for j in range(i + 1, n):
            if getattr(sortable[j], sort_by) <= getattr(sortable[min_index], sort_by):
                min_index = j

        min_item = sortable[min_index]
        sortable[min_index] = sortable[i]
        sortable[i] = min_item

        print(sortable)


def abc_sort(sortable, sort_by):
    assert type(sortable) is list

    n = len(sortable)
    for i in range(n//2):
        swapped = False
        for j in range(i, n - i - 1):
            if getattr(sortable[j], sort_by) < getattr(sortable[j + 1], sort_by):
                sortable[j], sortable[j + 1] = sortable[j + 1], sortable[j]
                swapped = True

        for j in range(n - i - 2, i, -1):
            if getattr(sortable[j], sort_by) > getattr(sortable[j - 1], sort_by):
                sortable[j], sortable[j - 1] = sortable[j - 1], sortable[j]
                swapped = True

        if not swapped:
            break

        print(sortable)


persons = [
    Person("Franta", 32),
    Person("Pepa", 17),
    Person("Petr", 25),
    Person("Jana", 23),
    Person("David", 23),
    Person("Martina", 25),
    Person("Lojza", 7),
    Person("Hanka", 23),
]

insert_sort(persons, 'age')

# select_sort(persons, 'age')

# abc_sort(persons, 'age')
