mirror of
https://github.com/AlatarQ/AHE.git
synced 2024-12-08 01:10:04 +01:00
AiSD | Ćwiczenie 6
This commit is contained in:
parent
bf58ea21aa
commit
8dc7981be5
BIN
AiSD/Ćwiczenie 6/AiSD5_C6 Ćwiczenie 6.pdf
Normal file
BIN
AiSD/Ćwiczenie 6/AiSD5_C6 Ćwiczenie 6.pdf
Normal file
Binary file not shown.
0
AiSD/Ćwiczenie 6/Zadanie_2.doc
Normal file
0
AiSD/Ćwiczenie 6/Zadanie_2.doc
Normal file
177
AiSD/Ćwiczenie 6/Zadanie_2.py
Normal file
177
AiSD/Ćwiczenie 6/Zadanie_2.py
Normal 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()
|
Loading…
Reference in New Issue
Block a user