Sprawdź się
Napisz program sortujący listę ciągów znaków zgodnie z porządkiem leksykograficznym, a następnie wypisujący ostatni element posortowanej listy. Skorzystaj z wybranego przez siebie stabilnego algorytmu sortowania. Zwróć uwagę, że elementy listy zapisane są wielkimi literami. Działanie swojego programu przetestuj dla następujących danych:
dane = ["WODA", "ZUPA", "KAWA", "LODY", "RYBA", "OWOC"]
Specyfikacja:
Dane:
dane– lista ciągów znaków do posortowania; każdy element składa się wyłącznie z dużych liter alfabetu łacińskiego
Wynik:
ostatni_element– ciąg znaków; ostatni element posortowanej listydane
Rozwiązanie wykorzystujące sortowanie kubełkowe:
dane = [ "WODA",
"ZUPA",
"KAWA",
"LODY",
"RYBA",
"OWOC" ]
def sortowanie_pozycyjne_slow(lista_slow):
def kubelki_iteracje(lista):
kub = []
dl = 0
for w in lista:
if len(w) > dl:
dl = len(w)
for l in w:
if not l.upper() in kub:
kub.append(l.upper())
return (sorted(kub), dl)
def sortuj(lista, pozycja, kb):
l = []
kubelki = { p : [] for p in kb}
for w in lista:
if len(w) < pozycja:
l.insert(0, w)
else:
lit = w[pozycja - 1].upper()
kubelki[lit].append(w)
for i in kubelki:
if len(kubelki[i]) > 0:
l += kubelki[i]
return l[:]
kb, il = kubelki_iteracje(lista_slow)
for i in range(il, 0, -1):
lista_slow = sortuj(lista_slow, i, kb)
return lista_slow[:]
lista_posortowana = sortowanie_pozycyjne_slow(dane)
ostatni_element = lista_posortowana[len(dane) - 1]
print(ostatni_element)Uzupełnij brakujące miejsca w kodzie tak, aby otrzymać działający program realizujący algorytm sortowania pozycyjnego słów. Swój program przetestuj dla listy dane = ["magda", "ala", "adam", "ewa"]. Elementy listy powinny zostać posortowane w porządku leksykograficznym.
Specyfikacja problemu:
Dane:
dane– lista zawierająca imiona do posortowania
Wynik:
dane– lista posortowana w porządku leksykograficznym
Przykładowe rozwiązanie zadania:
def przygotuj_slowa(dane, dlugosc_najdluzszego_slowa):
for indeks, slowo in enumerate(dane):
while len(slowo) < dlugosc_najdluzszego_slowa:
slowo += "`"
dane[indeks] = slowo
def wyczysc_napisy(dane):
for indeks, slowo in enumerate(dane):
dane[indeks] = slowo.replace("`", "")
def radix_sort(dane):
dlugosc_najdluzszego_slowa = max([len(slowo) for slowo in dane])
przygotuj_slowa(dane, dlugosc_najdluzszego_slowa)
for i in range(dlugosc_najdluzszego_slowa - 1, -1, -1):
sortowanie_przez_zliczanie(dane, i)
wyczysc_napisy(dane)
return dane
def sortowanie_przez_zliczanie(dane, indeks_znaku):
lista_zliczen_liczb = [0 for x in range(27)]
for slowo in dane:
odczytany_kod_znaku = ord(slowo[indeks_znaku]) - ord("`")
lista_zliczen_liczb[odczytany_kod_znaku] += 1
for i in range(1, len(lista_zliczen_liczb)):
lista_zliczen_liczb[i] += lista_zliczen_liczb[i - 1]
temp = ["" for slowo in dane]
for i in range(len(dane) - 1, -1, -1):
odczytany_kod_znaku = ord(dane[i][indeks_znaku]) - ord("`")
indeks_w_liscie_wynikowej = lista_zliczen_liczb[odczytany_kod_znaku] - 1
temp[indeks_w_liscie_wynikowej] = dane[i]
lista_zliczen_liczb[odczytany_kod_znaku] -= 1
for i in range(len(temp)):
dane[i] = temp[i]
dane = [
"magda",
"ala",
"adam",
"ewa"
]
posortowane_dane = radix_sort(dane)
print(posortowane_dane)Zmodyfikuj podany kod tak, aby sortował pozycyjnie ciągi znaków utworzone z cyfr. Skorzystaj w tym celu z algorytmu sortowania pozycyjnego słów, nie liczb – przykładowo: ciąg „9” jest większy od ciągu „11”. Zastosuj pomocniczo wybrany przez siebie stabilny algorytm sortowania. Lista powinna być posortowana nierosnąco.
Specyfikacja problemu:
Dane:
dane– lista zawierająca ciągi cyfr do posortowania
Wynik:
dane– lista posortowana nierosnąco
Przykładowe rozwiązanie zadania:
def przygotuj_slowa(dane, dlugosc_najdluzszego_slowa):
for indeks, slowo in enumerate(dane):
while len(slowo) < dlugosc_najdluzszego_slowa:
slowo += "/"
dane[indeks] = slowo
def wyczysc_napisy(dane):
for indeks, slowo in enumerate(dane):
dane[indeks] = slowo.replace("/", "")
def radix_sort(dane):
dlugosc_najdluzszego_slowa = max([len(slowo) for slowo in dane])
przygotuj_slowa(dane, dlugosc_najdluzszego_slowa)
for i in range(dlugosc_najdluzszego_slowa - 1, -1, -1):
sortowanie_przez_zliczanie(dane, i)
wyczysc_napisy(dane)
return dane
def sortowanie_przez_zliczanie(dane, indeks_znaku):
lista_zliczen_liczb = [0 for x in range(11)]
for slowo in dane:
odczytany_kod_znaku = ord(slowo[indeks_znaku]) - ord("/")
lista_zliczen_liczb[odczytany_kod_znaku] += 1
for i in range(len(lista_zliczen_liczb) - 2, -1, -1):
lista_zliczen_liczb[i] += lista_zliczen_liczb[i + 1]
temp = ["" for slowo in dane]
for i in range(len(dane) - 1, -1, -1):
odczytany_kod_znaku = ord(dane[i][indeks_znaku]) - ord("/")
indeks_w_liscie_wynikowej = lista_zliczen_liczb[odczytany_kod_znaku] - 1
temp[indeks_w_liscie_wynikowej] = dane[i]
lista_zliczen_liczb[odczytany_kod_znaku] -= 1
for i in range(len(temp)):
dane[i] = temp[i]
dane = [
"0123",
"94141",
"119",
"4964",
"750",
"0"
]
print(radix_sort(dane))Do konkursu dla startupów zgłosiło się wielu uczestników. Organizatorzy dokonali wstępnej selekcji. Przedstawiciele firm mieli prezentować swoje oprogramowanie w kolejności alfabetycznej. Jedna z przedstawicielek poprosiła o wniesienie wcześniej przygotowanej przez jej zespół makiety. Zespół techniczny poprosił o informację, która w kolejności jest prezentacja aplikacji NoStress. Użyj sortowania pozycyjnego słów, aby wyznaczyć indeks tej prezentacji w posortowanej liście.
Dla ułatwienia nazwy startupów zapisano małymi literami oraz bez znaków diakrytycznych. Pozbyto się również spacji.
Specyfikacja problemu:
Dane:
dane– lista zawierająca nazwiska dziennikarek i dziennikarzy
Wynik:
indeks elementu
nostressw posortowanej liściedane
Przykładowe rozwiązanie zadania:
def przygotuj_slowa(dane, dlugosc_najdluzszego_slowa):
for indeks, slowo in enumerate(dane):
while len(slowo) < dlugosc_najdluzszego_slowa:
slowo += "`"
dane[indeks] = slowo
def wyczysc_napisy(dane):
for indeks, slowo in enumerate(dane):
dane[indeks] = slowo.replace("`", "")
def radix_sort(dane):
dlugosc_najdluzszego_slowa = max([len(slowo) for slowo in dane])
przygotuj_slowa(dane, dlugosc_najdluzszego_slowa)
for i in range(dlugosc_najdluzszego_slowa - 1, -1, -1):
sortowanie_przez_zliczanie(dane, i)
wyczysc_napisy(dane)
return dane
def sortowanie_przez_zliczanie(dane, indeks_znaku):
lista_zliczen_liczb = [0 for x in range(27)]
for slowo in dane:
odczytany_kod_znaku = ord(slowo[indeks_znaku]) - ord("`")
lista_zliczen_liczb[odczytany_kod_znaku] += 1
for i in range(1, len(lista_zliczen_liczb)):
lista_zliczen_liczb[i] += lista_zliczen_liczb[i - 1]
temp = ["" for slowo in dane]
for i in range(len(dane) - 1, -1, -1):
odczytany_kod_znaku = ord(dane[i][indeks_znaku]) - ord("`")
indeks_w_liscie_wynikowej = lista_zliczen_liczb[odczytany_kod_znaku] - 1
temp[indeks_w_liscie_wynikowej] = dane[i]
lista_zliczen_liczb[odczytany_kod_znaku] -= 1
for i in range(len(temp)):
dane[i] = temp[i]
def znajdz_nazwe(dane):
posortowane_dane = radix_sort(dane)
for indeks, skladnik in enumerate(posortowane_dane):
if skladnik == "nostress":
return indeks
return -1
dane = [
"nostress",
"zdowozem",
"zatrudniamy",
"placteraz",
"zlinkujsie",
"bezkorkow",
"zgadajsie",
"zdrugiejreki",
"drugiezycie",
"rowermiejski",
"kiedytramwaj",
"zpierwszejreki",
"ekomiasto",
"cosdobrego"
]
print(znajdz_nazwe(dane))