AiSD | Ćwiczenie 6

This commit is contained in:
alatar 2024-02-10 14:45:06 +01:00
parent bf58ea21aa
commit 8dc7981be5
3 changed files with 177 additions and 0 deletions

Binary file not shown.

View File

View File

@ -0,0 +1,177 @@
from datetime import datetime
import sys
import random
C_IleLiczb=20
#--- Tworzenie tablicy losowych wartości
def TabLos():
Tab=[]
#Tab.append(-1)
random.seed(1) #Ustaw, by generować zawsze te same liczby
for i in range(0,C_IleLiczb):
Tab.append(random.randint(0,999))
return Tab
def PorownajTablice(dane):
print('Wiersz | Nieposortowane | Posortowane | Odwrotnie P.')
print('----------------------------------------------------')
T1=dane[0][1]
T2=dane[1][1]
T3=dane[2][1]
for i in range(0,len(T1)):
print(f'{i:6} | {T1[i]:14} | {T2[i]:11} | {T3[i]:12}')
def PorownajWyniki(stat):
print(' Metoda |Tablica | Porownania | Zamiany')
print('---------------------------------------------------------------------------------------------------')
for s in stat:
print(f'{s[1]:53} {s[0]:22} | {s[3]:10} | {s[4]:7}')
return
def sortBabelki(T1):
stat1 = stat2 = 0
T2 = T1[1].copy()
for i in range(0,len(T2)):
for j in range(len(T2)-1,i,-1):
if T2[j-1] > T2[j]:
T2[j], T2[j-1] = T2[j-1], T2[j]
stat2 +=1
stat1 += 1
return T1[0], "Sortowanie babelkowe", T2, stat1, stat2
def sortWstawianie(T1):
T2 = T1[1].copy()
stat1 = stat2 = 0
for i in range (1,len(T2)):
temp = T2[i]
j = i
while j > 0:
if temp < T2[j-1]:
stat1 += 1
T2[j] = T2[j-1]
stat2 += 1
j-=1
else:
stat1+=1
break
stat1 += 1
T2[j]=temp
return T1[0],"Sortowanie przez proste wstawianie", T2, stat1, stat2
def sortWstawianieStraz(T1):
T2 = T1[1].copy()
T2[:0] = [-1] #wstawiamy straznika
stat1 = stat2 = 0
for i in range (2,len(T2)):
temp = T2[i]
j = i
while temp < T2[j-1]:
T2[j] = T2[j-1]
j-=1
stat2 += 1
stat1 += 1
stat1+=1 # WYSKOCZENIE POZA PETLE TEZ WYMAGA SPRAWDZENIA WARUNKU
T2[j]=temp
T2.pop(0) #usuwamy straznika
return T1[0],"Sortowanie przez proste wstawianie ze straznikiem", T2, stat1, stat2
def sortWybieranie(T1):
T2 = T1[1].copy()
# Zmienne do przechowywania liczby porównań i zamian
stat1 = 0
stat2 = 0
# Przechodzimy przez wszystkie elementy listy, zaczynając od pierwszego
for i in range(0,len(T2) - 1):
# Zapamiętujemy indeks elementu, który chcemy wstawić na właściwe miejsce
temp_index = i
# Szukamy indeksu elementu najmniejszego w podzbiorze nieposortowanym
for j in range(i + 1, len(T2)):
# Zwiększamy licznik porównań o 1
stat1 += 1
if T2[j] < T2[temp_index]:
temp_index = j
# Zamieniamy element najmniejszy w podzbiorze z elementem na pozycji i
T2[i], T2[temp_index] = T2[temp_index], T2[i]
# Zwiększamy licznik zamian o 1
stat2 += 1
# Zwracamy posortowaną listę oraz liczbę porównań i zamian
return T1[0],"Sortowanie przez wybieranie", T2, stat1, stat2
def sortQuickREAL(T, lewy, prawy):
# Zmienne do przechowywania liczby polewyrównań i zamian
stat1 = 0
stat2 = 0
# Sprawdzamy, czy podtablica ma więcej niż jeden element
if lewy < prawy:
# Wybieramy ostatni element jako pivot
pivot = T[((prawy-lewy) // 2)]
# Ustawiamy wskaźniki i i j na początek i koniec podtablicy
i = lewy
j = prawy
# Powtarzamy dopóki wskaźniki się nie miną
while i <= j:
# Szukamy elementu większego lub równego pivot od lewej strony
while i <= j and T[i] < pivot:
i += 1
stat1 += 1
# Szukamy elementu mniejszego lub równego pivot od prawej strony
while i <= j and T[j] > pivot:
j -= 1
stat1 += 1
# Jeśli wskaźniki się nie minęły, zamieniamy elementy miejscami
if i <= j :
T[i], T[j] = T[j], T[i]
i += 1
j -= 1
stat2 += 1
# Sortujemy rekurencyjnie lewą i prawą część podtablicy
# Dodajemy liczbę porównań i zamian z podtablic
drop, Lstat1, Lstat2 = sortQuickREAL(T, lewy, i - 1)
drop, Rstat1, Rstat2 = sortQuickREAL(T, i + 1, prawy)
stat1 += Lstat1 + Rstat1
stat2 += Lstat2 + Rstat2
# Zwracamy posortowaną listę oraz liczbę porównań i zamian
return T, stat1, stat2
def sortQuick(d):
T2 = d[1].copy()
T2, stat1, stat2 = sortQuickREAL(T2,0,len(T2)-1)
return d[0],"Sortowanie QuickSort", T2, stat1, stat2
def revTab(T1):
T2 = []
for i in range(len(T1),0,-1):
T2.append(T1[i-1])
return T2
def Zadanie1():
tab_los = TabLos()
dane = []
dane.append(("Nieposortowane" , tab_los))
tab_sort = tab_los.copy();
tab_sort.sort()
dane.append(("Posortowane " , tab_sort))
tab_rev = revTab(tab_sort)
dane.append(("Odwrotnie posotwowane" , tab_rev))
stat = []
for d in dane:
stat.append(sortBabelki(d))
stat.append(sortWstawianie(d))
stat.append(sortWstawianieStraz(d))
stat.append(sortWybieranie(d))
stat.append(sortQuick(d))
PorownajTablice(dane)
print('\n')
PorownajWyniki(stat)
Zadanie1()