Explici sortarea
Identifici ordinea crescătoare și descrescătoare și motivul pentru care sortarea este utilă.
Selecția minimului: principiu, algoritm și implementare
Identifici ordinea crescătoare și descrescătoare și motivul pentru care sortarea este utilă.
Cauți poziția minimului în partea nesortată a listei.
Folosești poziția minimului pentru a aduce elementul pe locul corect.
Urmărești etapele, testezi cazuri relevante și estimezi numărul de comparații.
Care este ideea centrală a lecției?
Sortarea înseamnă așezarea elementelor unei liste într-o ordine stabilită. Pentru numere, cele mai uzuale sunt ordinea crescătoare și ordinea descrescătoare.
La fiecare pas, lista este privită ca două zone: în stânga se află partea deja sortată, iar în dreapta partea încă nesortată. Căutăm cel mai mic element din zona nesortată și îl aducem la începutul acesteia.
Dacă suntem la poziția i, căutăm minimul între pozițiile i și n - 1. Variabila poz_min reține poziția minimului, nu valoarea lui.
După ce am identificat minimul, acesta trebuie să ajungă pe poziția i. În Python putem schimba direct două valori prin a[i], a[poz_min] = a[poz_min], a[i].
Imaginează-ți cartonașe cu punctaje așezate pe o masă. Pentru primul loc cauți cel mai mic punctaj dintre toate cartonașele și îl așezi primul. Pentru al doilea loc cauți minimul dintre cartonașele rămase. Repeți până când lista este ordonată.
Pornește cu lista [7, 4, 9, 2, 5]. La fiecare pas vezi toate comparațiile făcute pentru găsirea minimului. Exemplul conduce de la [7, 4, 9, 2, 5] la [2, 4, 9, 7, 5].
[7, 4, 9, 2, 5]Pasul 0. Partea sortată este vidă.
Apasă „Pas următor” pentru a vedea comparațiile.
După găsirea minimului, se afișează interschimbarea și noua listă, apoi începe următoarea poziție.
poz_min?În Python, schimbarea simultană a două elemente este simplă:
a = [7, 4, 9, 2, 5]
a[0], a[3] = a[3], a[0]
print(a)
Pentru sortare, bucla exterioară stabilește începutul zonei nesortate, iar bucla interioară caută poziția minimului.
a = [7, 4, 9, 2, 5]
n = len(a)
for i in range(n - 1):
poz_min = i
for j in range(i + 1, n):
if a[j] < a[poz_min]:
poz_min = j
if poz_min != i:
a[i], a[poz_min] = a[poz_min], a[i]
print(a)
Algoritm SelectiaMinimului
citește lista a și n
pentru i ← 0, n - 2 execută
poz_min ← i
pentru j ← i + 1, n - 1 execută
dacă a[j] < a[poz_min] atunci
poz_min ← j
sfârșit dacă
sfârșit pentru
dacă poz_min ≠ i atunci
interschimbă a[i] cu a[poz_min]
sfârșit dacă
sfârșit pentru
scrie lista sortată
SFÂRȘIT ALGORITM
poz_min, care este poziția ei.Se citește o listă de n numere întregi. Să se sorteze crescător folosind selecția minimului.
Date de intrare: n și cele n valori. Date de ieșire: lista în ordine crescătoare. La fiecare pas determinăm minimul din partea nesortată și îl aducem pe poziția curentă.
n = int(input())
a = []
for i in range(n):
a.append(int(input()))
for i in range(n - 1):
poz_min = i
for j in range(i + 1, n):
if a[j] < a[poz_min]:
poz_min = j
if poz_min != i:
a[i], a[poz_min] = a[poz_min], a[i]
print(a)
Pentru [7, 4, 9, 2, 5]: la i=0, poz_min=3, rezultă [2,4,9,7,5]; la i=1, minimul este deja 4; la i=2, minimul este 5 și obținem [2,4,5,7,9].
[7,4,9,2,5] → [2,4,5,7,9][8] → [8][5,5,5,5] → aceeași listă[1,2,3,4] → aceeași listă[5,4,3,2,1] → [1,2,3,4,5]După pasul i, pozițiile de la 0 la i conțin cele mai mici i+1 elemente, în ordine. Pentru n elemente se fac n(n-1)/2 comparații, deci timpul este de ordin O(n²).
1. Ce reține poz_min?
2. Unde se caută minimul la pasul i?
3. Care este ordinul de complexitate al timpului?
4. Ce se întâmplă după fiecare pas?
5. Ce se întâmplă pentru o listă cu un singur element?
6. De ce avem nevoie de poziția minimului?
citește punctajele a n participanți și sortează-le descrescător prin selecția maximului. Afișează lista inițială, lista după fiecare pas important, lista finală și primele 3 punctaje. Testează o listă aleatorie, una sortată, una cu valori egale și una cu un singur participant.
Recitește algoritmul, verifică testele și justifică alegerea metodei.