Annettuna on lista, jossa on jokin lukujen permutaatio, jossa on parillinen. Saat jokaisella siirrolla vaihtaa kaksi vierekkäistä lukua keskenään. Tehtäväsi on järjestää lista siten, että listan puolivälistä katsottuna kaikki alkupuolen luvut ovat pienempiä kuin kaikki loppupuolen luvut. Mikä on pienin määrä siirtoja?
Voit olettaa, että on enintään . Tavoitteena on, että algoritmin aikavaativuus on tai .
Toteuta tiedostoon semisort.py
funktio solve
, joka antaa pienimmän siirtojen määrän.
def solve(t): # TODO if __name__ == "__main__": print(solve([2, 1, 4, 3])) # 0 print(solve([5, 3, 4, 1, 6, 2])) # 6 print(solve([6, 5, 4, 3, 2, 1])) # 9 print(solve([10, 1, 9, 2, 8, 3, 7, 4, 6, 5])) # 15
Selitys: Listalla alkupuoliskon luvut eli ja ovat jo valmiiksi kaikki pienempiä kuin loppupuolen luvut ja . Listalla tarvitaan ainakin siirtoa. Tässä on yksi optimaalinen ratkaisu: