Rendező algortmusok Tartalomjegyzék Csere...2 Tömbelemek cseréje...2 Tömbelemek cseréje a a[]>a[+1]...3 n-1 csere, a a[]>a[+1]...4 (n-1)*(n-1) csere, a a[]>a[+1]...5 Buborék rendezés...6 Cserés rendezés...7 Mnmum kválasztásos rendezés...8 Beszúrásos rendezés...9 Készítette: Gál Tamás Creatve Commons -Nevezd meg!-ne add el!-így add tovább! 2.5 Magyarország lcenc alatt asználató GT Rendező algortmusok 1
Csere tmp = a a = b b = tmp C# és Java kód nt a = 5; nt b = 6; nt tmp; tmp = a; a = b; b = tmp; tmp = a a = b b = tmp Console.WrteLne("a: "+a); Console.WrteLne("b: "+b); - Console.WrteLne elyett System.out.prntln Tömbelemek cseréje tmp = a[] a[] = a[+1] a[+1] = tmp nt[] a = {22, 5, 4, 2; nt n = a.lengt; //a tömb mérete nt tmp, = 0; for (nt j=0;j<n;j++) {Console.Wrte(a[j]+", "); tmp = a[]; a[] = a[+1]; a[+1] = tmp; Console.WrteLne(); for (nt j=0;j<n;j++) {Console.Wrte(a[j]+", "); tmp = a[] a[] = a[+1] a[+1] = tmp - Console.Wrte elyett System.out.prnt - Console.WrteLne elyett System.out.prntln GT Rendező algortmusok 2
Tömbelemek cseréje a a[]>a[+1] Csak akkor cserélünk, a a nagyobb ndexű elem értéke ksebb. a a[]>a[+1] akkor tmp = a[] a[] = a[+1] a[+1] = tmp a vége nt[] a = {22, 5, 2, 4; nt n = a.lengt; //a tömb mérete nt tmp, = 0; for (nt j=0;j<n;j++) {Console.Wrte(a[j]+", "); tmp = a[] a[] = a [+1] a[+1] = a[] a[] > a[+1] f(a[]>a[+1]) { tmp = a[]; a[] = a[+1]; a[+1] = tmp; Console.WrteLne(); for (nt j=0;j<n;j++) {Console.Wrte(a[j]+", "); - Console.Wrte elyett System.out.prnt - Console.WrteLne elyett System.out.prntln Utána: 5, 22, 4, 2, GT Rendező algortmusok 3
n-1 csere, a a[]>a[+1] A tömböt egyszer véggjárjuk az egymás mellett tömbelemeket kcseréljük, a a nagyobb ndexű elem értéke ksebb. cklus j=0 -tól n-2 -g a a[j]>a[j+1] akkor tmp = a[j] a[j] = a[j+1] a[j+1] = tmp a vége cklus vége nt[] a = {22, 5, 4, 2; nt n = a.lengt; //a tömb mérete nt tmp; for (nt k=0;k<n;k++) {Console.Wrte(a[k]+", "); csere(a[j],a[j+1]) j = 0 j < n-1 a[j] > a[j+1] for (nt j=0;j<n-1;j++) { f(a[j]>a[j+1]) { tmp = a[j]; a[j] = a[j+1]; a[j+1] = tmp; Console.WrteLne(); for (nt k=0;k<n;k++) {Console.Wrte(a[k]+", "); - Console.Wrte elyett System.out.prnt - Console.WrteLne elyett System.out.prntln 1. csere: 22, 5, 4, 2, 2. csere: 5, 22, 4, 2, 3. csere: 5, 4, 22, 2, Utána: 5, 4, 2, 22, GT Rendező algortmusok 4
(n-1)*(n-1) csere, a a[]>a[+1] A tömböt n-1 -szer véggjárjuk az egymás mellett tömbelemeket kcseréljük, a a nagyobb ndexű elem értéke ksebb. A végeredmény rendezett tömb lesz, de gen sok felesleges műveletet végzünk. = 0 Cklus := 0 tól n-2 -g Cklus j := 0-től n-2 -g Ha a[j] > a[j+1] akkor Csere( a[j], a[j+1] ) Clus vége Cklus vége nt[] a = {22, 5, 4, 2; nt n = a.lengt; //a tömb mérete nt tmp; for (nt k=0;k<n;k++) {Console.Wrte(a[k]+", "); for (nt =0;<n-1;++) { for (nt j=0;j<n-1;j++) { f(a[j]>a[j+1]) { tmp = a[j]; a[j] = a[j+1]; a[j+1] = tmp; Console.WrteLne(); for (nt k=0;k<n;k++) {Console.Wrte(a[k]+", "); - Console.Wrte elyett System.out.prnt - Console.WrteLne elyett System.out.prntln = + 1 csere(a[j],a[j+1]) < n-1 j = 0 j < n-1 a[j] > a[j+1] 1. külső cklus végén: 5, 4, 2, 22, 2. külső cklus végén: 4, 2, 5, 22, 3. külső cklus végén: 2, 4, 5, 22, Utána: 2, 4, 5, 22 GT Rendező algortmusok 5
Buborék rendezés Az egymás után elemeket összeasonlítjuk. Ha a nagyobb értékű elem alacsonyabb ndexű elyen van, akkor kcseréljük őket. A tömbön először véggaladva a legnagyobb elem a legnagyobb sorszámú elyen lesz. A külső cklus cklusváltozója n-1-től csökken 1-g. A belső cklus csak 0-tól -1 -g tart. Cklus := n-1 től 1 -g Cklus j := 0-től -1 -g Ha a[j] > a[j+1] akkor Csere( a[j], a[j+1] ) Clus vége Cklus vége nt[] a = {22, 5, 4, 2; nt n = a.lengt; //a tömb mérete nt tmp; for (nt k=0;k<n;k++) {Console.Wrte(a[k]+", "); for (nt =n-1;>0;--) { for (nt j=0;j<;j++) { f(a[j]>a[j+1]) { tmp = a[j]; a[j] = a[j+1]; a[j+1] = tmp; Console.WrteLne(); for (nt k=0;k<n;k++) {Console.Wrte(a[k]+", "); = n - 1 > 0 j = 0 j < - 1 = - 1 a[j] > a[j+1] csere(a[j],a[j+1]) - Console.Wrte elyett System.out.prnt - Console.WrteLne elyett System.out.prntln 1. külső cklus végén: 5, 4, 2, 22, 2. külső cklus végén: 4, 2, 5, 22, 3. külső cklus végén: 2, 4, 5, 22, Utána: 2, 4, 5, 22 GT Rendező algortmusok 6
Cserés rendezés A tömb 1..N eleme közül kválasztjuk a legksebbet, majd azt a legelső elem elyére tesszük. A tömb 2..N eleme közül kválasztjuk a legksebbet, majd azt a másodk elem elyére tesszük. Cklus := 0 tól n-2 -g Cklus j := +1-től n-1 -g Ha a[] > a[j] akkor Csere( a[], a[j] ) Clus vége Cklus vége nt[] a = {22, 5, 4, 2; nt n = a.lengt; //a tömb mérete nt tmp; for (nt k=0;k<n;k++) {Console.Wrte(a[k]+", "); for (nt =0;<n-1;++) { for (nt j=+1;j<n;j++) { f(a[]>a[j]) { tmp = a[j]; a[j] = a[]; a[] = tmp; Console.WrteLne(); for (nt k=0;k<n;k++) {Console.Wrte(a[k]+", "); = + 1 csere(a[],a[j]) = 0 < n-1 j = +1 j < n a[] > a[j] - Console.Wrte elyett System.out.prnt - Console.WrteLne elyett System.out.prntln 1. külső cklus végén: 2, 22, 5, 4, 2. külső cklus végén: 2, 4, 22, 5, 3. külső cklus végén: 2, 4, 5, 22, Utána: 2, 4, 5, 22 GT Rendező algortmusok 7
Mnmum kválasztásos rendezés Működése asonló a cserés rendezésez, a csere csak a belső cklus után valósul meg. A belső cklus csak értékadást tartalmaz, amnek futás deje lényegesen rövdebb. Cklus := 0 tól n-2 -g mn = ; Cklus j := +1-től n-1 -g Ha a[] > a[j] akkor mn = j Clus vége Csere( a[], a[mn] ) Cklus vége nt[] a = {22, 5, 4, 2; nt n = a.lengt; //a tömb mérete nt tmp, mn; for (nt k=0;k<n;k++) {Console.Wrte(a[k]+", "); for (nt =0;<n-1;++) { mn = ; for (nt j=+1;j<n;j++) { f(a[]>a[j]) { mn = j; tmp = a[mn]; a[mn] = a[]; a[] = tmp; = + 1 csere(a[],a[j]) = 0 < n-1 j = +1 j < n a[] > a[j] Console.WrteLne(); for (nt k=0;k<n;k++) {Console.Wrte(a[k]+", "); - Console.Wrte elyett System.out.prnt - Console.WrteLne elyett System.out.prntln 1. külső cklus végén: 2, 5, 4, 22, 2. külső cklus végén: 2, 4, 5, 22,, 3. külső cklus végén: 2, 4, 5, 22, Utána: 2, 4, 5, 22 GT Rendező algortmusok 8
Beszúrásos rendezés Sorra egymás után kemeljük a tömb elemet. Ha a kemelt elem előtt nála nagyobb elemeket találunk, akkor azokat eggyel átrább másoljuk. Cklus = 1 től n-1 -g kulcs = a[] j = -1 Cklus amíg j >= 0 és a[j]>kulcs a[j+1] = a[j] j = j 1 Clus vége a[j+1] = kulcs Cklus vége = 1 < n kulcs = a[] nt[] a = {22, 5, 4, 2; nt n = a.lengt; //a tömb mérete nt j, kulcs; for (nt k=0;k<n;k++) {Console.Wrte(a[k]+", "); j = - 1 j>=0 és a[j]>kulcs for (nt =1;<n;++) { kulcs = a[]; j = -1; wle(j >= 0 && a[j]>kulcs) { a[j+1] = a[j]; j = j - 1; a[j+1] = kulcs; Console.WrteLne(); for (nt k=0;k<n;k++) {Console.Wrte(a[k]+", "); a[j+1] = a[j] j = j - 1 a[j+1] = kulcs = + 1 - Console.Wrte elyett System.out.prnt - Console.WrteLne elyett System.out.prntln Kulcs=5 > 5, 22, 4, 2, Kulcs=4 > 4, 5, 22, 2, Kulcs=2 > 2, 4, 5, 22, Utána: 2, 4, 5, 22, GT Rendező algortmusok 9