2021. május 9., vasárnap

A helycserés rendezés algoritmusának alkalmazása Pythonban

Adott egy lista, és szeretnénk emelkedő számsorrendebe rendezni a lista elemeit. A legegyszerűbb cserés rendezést fogjuk alkalmazni.  Sokféle módszer létezik, van még a minimum kiválasztásos rendezés, a buborékrendezés, a javított buborékos rendezés, a beillesztéses rendezés, a javított beillesztéses rendezés, a szétosztó rendezés, a számlálva szétosztó rendezés, a számláló rendezés, a gyorsrendezés stb.

A range()függvény visszatér egy számsorozathoz, alapértelmezés szerint 0-tól kezdődően, 1-gyel növekszik (alapértelmezés szerint), és egy megadott szám előtt leáll.

Házi feladat megoldása


lista = [5, 3, 9, 1, 7]
 
for i in range(len(lista)-1):
    for j in range(i+1, len(lista)):
        print(i, j, lista, end='')
        if lista[i] > lista [j]:
            lista[i], lista[j] = lista[j], lista[i]
            print('!', lista[i], lista[j])
            print('   ', lista)
        else:
            print('')

Nézzük a folyamatot és a sor alján a megoldást.
0 1 [5, 3, 9, 1, 7]! 3 5
    [3, 5, 9, 1, 7]
0 2 [3, 5, 9, 1, 7]
0 3 [3, 5, 9, 1, 7]! 1 3
    [1, 5, 9, 3, 7]
0 4 [1, 5, 9, 3, 7]
1 2 [1, 5, 9, 3, 7]
1 3 [1, 5, 9, 3, 7]! 3 5
[1, 3, 9, 5, 7]
1 4 [1, 3, 9, 5, 7]
2 3 [1, 3, 9, 5, 7]! 5 9
    [1, 3, 5, 9, 7]
2 4 [1, 3, 5, 9, 7]
3 4 [1, 3, 5, 9, 7]! 7 9
    [1, 3, 5, 7, 9]                      #  Megoldás!


https://infopy.eet.bme.hu/qsort/


Numerikus rendezés

thislist = [100, 50, 65, 82, 23]
thislist.sort()
print(thislist)


Fordítva

thislist = [100, 50, 65, 82, 23]
thislist.sort(reverse = True)
print(thislist)


Előző házi feladat
----------------------

Írassuk ki a számokat 1-től 100-ig 

Megoldás:

i = 1
while i <= 100:
    print(i)
    i += 1

--------------------------------

Régi Házi Feladat: kérjünk be egy egész számot és döntsük el, hogy páros vagy páratlan!

 A program: a = int(input('Kérem az egész számot! '))

 if a % 2 == 1: print('A szám páratlan.') 

else: print('A szám páros.')
------------------

Feladat: adjuk össze a pozitív egész számokat 1-től 50-ig!
A program:
s = 0
for i in range(1, 51):
   s = s + i
print('A számok összege: ', s)

--------------------------------------------
Írassuk ki a 100-nál kisebb, 3-mal osztva 1 maradékot adó pozitív egész számokat!
A program (megszámlálásos):
for i in range(100):
    if i % 3 == 1:
        print(i)
---------------------------
Ugyanennek a feladatnak a megoldása elöl tesztelő ciklussal:
i = 1
while i < 100:
    if i % 3 == 1:
        print(i)
    i += 1
---------------------------
 Írjunk programot, ami beolvassa egy háromszög 3 oldalát és azokból kiszámolja a háromszög területét (Héron-képlettel).

A program:

import math
a = float(input('a= '))
b = float(input('b= '))
c = float(input('c= '))
if a>0 and b>0 and c>0 and (a+b>c) and (a+c>b) and (b+c>a):
    s = (a+b+c)/2
    t = math.sqrt(s*(s-a)*(s-b)*(s-c))
    print('A háromszög területe: ', round(t, 2))
else:
    print('Nem létezik a háromszög!')
-----------------------
Olvassunk be egy egész számot a billentyűzetről és döntsük el, hogy a szám prím-e!
A program:
n = int(input('Kérem az egész számot! '))
i = 2
while n % i != 0:
    i = i + 1
if i == n:
    print('A szám prím.')
else:
    print('A szám nem prím.')
----------------------------
 egy 10 elemű, egész számokat tartalmazó lista elemeit adjuk össze és írjuk ki az összeget! (Összegzés tétele)
megoldás:
lista = [3, 1, 7, 11, 2, 3, -1, -7, -11, -2]
s = 0
for x in lista:
    s += x
print('A lista elemeinek összege: ', s)

-----------------------------
Algoritmus értelmezése Maximum-kiválasztás tétele is. Miről is van itt szó?
Adva van például egy számokból álló sorozat. Az a feladat, hogy mondjuk meg, melyik ezek közül a legnagyobb? Előfordulhat, hogy a sorozatban több legnagyobb elem van. Ilyenkor általában elég egyet megadni eredményként. Azt is megkérdezhetjük, hogy hányadik tagja a sorozatnak a legnagyobb elem? Nézzük az algoritmus mondatszerű leírását:

Eljárás: Be: N, a() 
max = a(1)
ciklus i = 2-től n-ig
   Ha a(i) > max, akkor max = a(i)          (*)
ciklus vége
Ki: max

Most értelmezzük az algoritmust sorról-sorra.

Az első lépésben egy max nevű változónak értéket adunk: legyen egyenlő a sorozat első elemével.
Ezután elindítunk egy megszámlálásos ciklust, ami i=2-tól indul, hiszen az első elem lett a max értéke. A ciklusmagban egy feltételvizsgálat van: megvizsgáljuk, hogy a sorozat i-edik eleme nagyobb-e a max értékénél. Ha igen, akkor ez azt jelenti, hogy az addigi legnagyobb elemnél találtunk nagyobbat, tehát erre az értékre kell beállítani a max értékét. Ha nem, akkor vesszük a sorozat következő elemét. Amikor vége a ciklusnak, a max nevű változóban lesz a sorozat legnagyobb eleme. Megjegyzés: ennek a tételnek a párja a minimum-kiválasztás tétele. Ennek az algoritmusában max helyett min van, továbbá a (*)-gal jelölt sorban a következő szerepel: Ha a(i) < min, akkor min = a(i)

-----------------------

Írjunk programot, amely egy N elemet tartalmazó tömbről megmondja, hogy a szomszédos elemek között mekkora a legnagyobb különbség abszolút értékben!
A Python program:
tomb = [2, 1, 5, 4, 11, 6, 8, 20, 14, 7]
n1 = len(tomb)
max = abs(tomb[1] - tomb[0])
for i in range(1, n1-1):
    if abs(tomb[i+1] - tomb[i]) > max:
        max = abs(tomb[i+1] - tomb[i])
print('A legnagyobb különbség abszolut értékben: ', max)

Még néhány alapalgoritmus

 Összegzés

Függvény Összegzés( A: Sorozat ): ElemTip
Változó
i: egész;
S: elemtip;
FKEZD
S ← 0
Ciklus (i ← 1 . . . A.elemsz´am)
S ← S + A[i]
CVége
Összegzés ← S
FVÉGE

Megszámlálás

Függvény Megszámlálás( A: sorozat ): Egész
Változó
i, DB: egész;
FKEZD
DB ← 0
Ciklus (i ← 1 . . . A.elemsz´am)
HA T(A[i])
DB ← DB + 1
HVége
CVége
Megszámlálás ← DB
FVÉGE

 Maximum és minimum

Maximum

Függvény MaxElem( A: sorozat ): elemtip
Változó
i: egész;
Max: elemtip;
FKEZD
Max ← A[1]
Ciklus (i ← 2 . . . A.elemsz´am)
HA A[i]> Max
Max ← A[i]
HVége
CVége
MaxElem ← Max
FVÉGE
Függvény MaxHelyE( A: sorozat ): egésztip
Változó
i: egész;
MaxH: egész;
FKEZD
MaxH ← 1
Ciklus (i ← 2 . . . A.elemsz´am)
HA A[i] > A[MaxH]
MaxH ← i
HVége
CVége
MaxHelyE ← MaxH
FVÉGE
156
Függvény MaxHelyU( A: sorozat ): egésztip
Változó
i: egész;
MaxH: egész;
FKEZD
MaxH ← 1
Ciklus (i ← 2 . . . A.elemsz´am)
HA A[i] > A[MaxH]
MaxH ← i
HVége
CVége
MaxHelyU ← MaxH
FVÉGE

Eldöntés

Függvény Eldöntés( A: sorozat ): Logikai
Változó
i: egész;
FKEZD
i ← 1
Ciklus Míg (i 6 n) És (Nem T(A[i]))
i ← i + 1
CVége
Eldöntés ← (i 6 n)
FVÉGE

Lineáris keresés

Függvény LineárisKeresés(
A: sorozat;
Adat: elemtip;
Hely: egész ): Logikai
Változó
i: egész;
FKEZD
i ← 1
Ciklus Míg (i 6 n) És (Nem A[i] =Adat))
i ← i + 1
CVége
Hely ← i
LineárisKeresés ← (i 6 n)
FVÉGE

Kiválasztás

Eljárás Kiválasztás(
A: sorozat;
Adat: elemtip;
Hely: egész )
Változó
i: egész;
FKEZD
i ← 1
Ciklus Míg (Nem A[i] =Adat)
i ← i + 1
CVége
Hely ← i
EVÉGE

Strázsás keresés

Függvény StrázsásKeresés(
A: sorozat;
Adat: elemtip;
Hely: egész ): Logikai
Változó
i: egész;
FKEZD
i ← 1
A[n + 1] ← Adat
Ciklus Míg (Nem A[i] =Adat)
i ← i + 1
CVége
Hely ← i
StrázsásKeresés ← (i 6 n)
FVÉGE

Lineáris keresés rendezett sorozaton

Függvény RendLinKeres(
A: sorozat;
Adat: elemtip;
Hely: egész ): Logikai
Változó
i: egész;
FKEZD
i ← 1
Ciklus Míg (i 6 n) ÉS (Nem A[i] <Adat)
i ← i + 1
CVége
Hely ← i
RendLinKeres ← (i 6 n) ÉS (A[i] <Adat)
FVÉGE


Bináris keresés

Függvény BinárisKeresés(A: sorozat;
Adat: elemtip;
Hely: egész ): Logikai Változó
E, U, K: egész;
FKEZD
E ← 1
U ← n
K ← (E+U) DIV 2
Ciklus Míg (E 6 U) ÉS (A[K] ̸=Adat)
Elágazás
Amikor (Adat <A[K]):
U ← K−1
Amikor (Adat >A[K]):
E ← K+1
EVége
K ← (E+U) DIV 2
CVége
Hely ←K
BinárisKeresés ← (E 6 U)
FVÉGE
160
Függvény RekBinKer(
A: sorozat;
Adat: elemtip;
Hely, E, U: egész ): Logikai
Változó
K: egész;
FKEZD
Ha (E>U)
RekBinKer ← Hamis
különben
K ← (E+U) DIV 2
Elágazás
Amikor (Adat <A[K]):
RekBinKer ← RekBinKer(A, Adat, Hely, E, K−1)
Amikor (Adat >A[K]):
RekBinKer ← RekBinKer(A, Adat, Hely, K+1, U)
Különben
Hely ← K
RekBinKer ← Igaz
EVége
HVége
FVÉGE

Nincsenek megjegyzések:

Megjegyzés küldése