[[:oktatas:programozás:programozási tételek|< Programozási tételek]] ====== Programozási tételek Java megvalósításban ====== * **Szerző:** Sallai András * Copyright (c) Sallai András, 2011, 2016, 2017, 2023 * Licenc: [[https://creativecommons.org/licenses/by-sa/4.0/|CC BY-SA 4.0]] * Web: https://szit.hu ===== Tételek ===== ==== Összegzés ==== class Program { public static void main(String[] argv) { int[] tomb = {3, 8, 2, 4, 5, 1, 6}; int osszeg = 0; for(int i=0; i<7; i++) osszeg = osszeg + tomb[i]; System.out.println(osszeg); } } ==== Megszámolás ==== class Program { public static void main(String[] argv) { int[] tomb = {3, 8, 2, 4, 5, 1, 6}; int n = 7; int szamlalo = 0; for(int i=0; i 5) szamlalo++; System.out.println(szamlalo); } } ==== Eldöntés tétel ==== class Program { public static void main(String[] argv) { int[] tomb = {3, 8, 2, 4, 5, 1, 6}; int n = 7; // A tömb elemeinek száma int ker = 2; //Amiről el szeretnénk dönteni, hogy van-e ilyen int i = 0; while(i ==== Kiválasztás tétel ==== class Program { public static void main(String[] argv) { int[] tomb = {3, 8, 2, 4, 5, 1, 6}; int n = 7; // A tömb elemeinek száma int ker = 2; //Amiről szeretnénk tudni, hogy hányadik helyen van int i = 0; while(tomb[i] != ker) i++; System.out.printf("%d\n", i + 1); } } ==== Keresés tétel ==== class Program { public static void main(String[] argv) { int[] tomb = {3, 8, 2, 4, 5, 1, 6}; int n = 7; // A tömb elemeinek száma int ker = 2; //Amit keresünk int i = 0; while(i ==== Kiválogatás tétel ==== class Program { public static void main(String[] argv) { int[] a = {3, 8, 2, 4, 5, 1, 6}; int n = 7; // A tömb elemeinek száma int[] b = new int[n]; int j=0; for(int i=0; i 5) b[j++] = a[i]; int m = j; //A "b" tömb elemeinek száma //Első tömb kiíratva: for(int i=0; i ==== Szétválogatás tétel ==== class Program { public static void main(String[] argv) { int[] a = {3, 8, 2, 4, 5, 1, 6}; int n = 7; // A tömb elemeinek száma int[] b = new int[n]; int[] c = new int[n]; int j=0; int k=0; for(int i=0; i 5) b[j++] = a[i]; else c[k++] = a[i]; int m = j; //A "b" tömb elemeinek száma int l = k; //A "c" tömb elemeinek száma //Első tömb kiíratva: for(int i=0; i ==== Metszet tétel ==== class Program { public static void main(String[] argv) { int[] a = {3, 8, 2, 4, 5, 1, 6}; int n = 7; // Az első tömb elemeinek száma int[] b = {4, 7, 9, 8, 2}; int m = 5; //A második tömb elemeinek száma int[] c = new int[n+m]; //A harmadik tömb int j; int k = 0; for(int i=0; i ==== Unió tétel ==== /* Unió tétel */ class Program7 { public static void main(String[] argv) { int[] a = {3, 8, 2, 4, 5, 1, 6}; int n = 7; // Az első tömb elemeinek száma int[] b = {4, 7, 9, 8, 2}; int m = 5; //A második tömb elemeinek száma int[] c = new int[n+m]; //A harmadik tömb for(int i=0; i=n) { k++; c[k] = b[j]; } } int l = k + 1; //A "c" tömb elemeinek száma //Első tömb kiíratva: for(int i=0; i ==== Maximum kiválasztás tétele ==== class Program { public static void main(String[] argv) { int[] tomb = {3, 8, 2, 4, 5, 1, 6}; int n = 7; // A tömb elemeinek száma int max = tomb[0]; for(int i=0; i max) max = tomb[i]; System.out.println("Legnagyobb: " + max); } } ==== Minimumkiválasztás tétele ==== class Program { public static void main(String[] argv) { int[] tomb = {3, 8, 2, 4, 5, 1, 6}; int n = 7; // A tömb elemeinek száma int min = tomb[0]; for(int i=0; i ===== Rendezések ===== ==== Buborék rendezés ==== /* Buborék rendezés */ class Program { public static void main(String args[]) { int[] tomb = {3, 8, 2, 4, 5, 1, 6}; int n = 7; // A tömb elemeinek száma for(int i= n-1; i>0; i--) for(int j=0; j tomb[j+1]) { int tmp = tomb[j]; tomb[j] = tomb[j+1]; tomb[j+1] = tmp; } for(int i=0; i Vagy: /* Buborék rendezés */ class Program { public static void main(String args[]) { int[] tomb = {3, 8, 2, 4, 5, 1, 6}; int n = 7; // A tömb elemeinek száma for(int i= n-2; i>0; i--) for(int j=0; j<=i; j++) if(tomb[j] > tomb[j+1]) { int tmp = tomb[j]; tomb[j] = tomb[j+1]; tomb[j+1] = tmp; } for(int i=0; i Utóbbi különbsége: mettől-meddig megyünk a ciklusban. ==== Beszúrásos rendezés ==== Rekurzív megvalósítás: package rendezesbeszurassal; public class RendezesBeszurassal { static void rendezesBeszurassalR(int[] t, int n) { if(n>0) { // eredeti: n>1 rendezesBeszurassal(t, n-1); int x = t[n-1]; // eredeti: t[n] int j = n-2; // eredeti: n-1 while(j>= 0 && t[j]>x) { t[j+1] = t[j]; j = j-1; } t[j+1] = x; } } static void kiir(int[] t) { for (int i = 0; i < t.length; i++) { System.out.print(t[i]+" "); } System.out.println(); } public static void main(String[] args) { int[] t = {35, 24, 83, 12, 7, 23}; rendezesBeszurassalR(t, t.length); kiir(t); } } Normál megvalósítás: static void rendezesBeszurassal(int[] t) { for (int i = 0; i < t.length; i++) { //eredeti: i=1 int x = t[i]; int j = i - 1; while(j>=0 && t[j]>x) { t[j+1] = t[j]; j = j - 1; } t[j+1] = x; } } A megjegyzések azokra a tömbökre utalnak, ahol a kezdőérték 1. ==== Gyorsrendezés ==== Különböző változatokat látunk itt a gyorsrendezésre. A tömböt felosztjuk három részre. Egy kisebb, egy egyenlő és egy nagyobb részre, a pivot elem alapján. Ezt követően rekurzívan hívja önmagát az egyes részekre. import java.util.ArrayList; import java.util.Arrays; public class Program01 { static ArrayList quicksort(ArrayList list) { if (list.size() <= 1) { return list; } ArrayList less = new ArrayList<>(); ArrayList equal = new ArrayList<>(); ArrayList greater = new ArrayList<>(); int pivot = list.get(list.size()-1); for (Integer x : list) { if (x < pivot) less.add(x); if (x == pivot) equal.add(x); if (x > pivot) greater.add(x); } ArrayList sumList = new ArrayList(); sumList.addAll(quicksort(less)); sumList.addAll(equal); sumList.addAll(quicksort(greater)); return sumList; } static void kiirLista(ArrayList list) { for(Integer x : list) { System.out.print(x + " "); } System.out.println(); } public static void main(String[] args) { Integer[] t = {8, 2, 7, 9, 5, 4, 3}; ArrayList list = new ArrayList<>(Arrays.asList(t)); list = quicksort(list); kiirLista(list); } } A következő **helyben rendező** változat hatékonyabb lehet nagyobb méretű elem számnál, mivel nem készít újabb tömböket, helyette a bemeneti tömbön dolgozik. A bal és jobb széleket azért kell megadni, mert rekurzióban így egyre kisebb tömböket kell átnéznie az algoritmusnak. Így a tömb rendezésekor a második paraméter mindig 0, a harmadik paraméter mindig n-1, ahol n a tömb elemeinek száma. A következő példa tömbön dolgozik: class Program { static void gyors(int[] tomb, int bal, int jobb) { if(bal < jobb) { int also = bal, felso = jobb + 1, kulcs = tomb[bal]; for( ; ; ) { while(++also < felso && tomb[also] < kulcs) ; while(tomb[--felso] > kulcs) ; if(also >= felso) break; csere(tomb, also, felso); } csere(tomb, felso, bal); gyors(tomb, bal, felso -1); gyors(tomb, felso+1, jobb); } } static void csere(int[] tomb, int i, int j) { int seged = tomb[i]; tomb[i] = tomb[j]; tomb[j] = seged; } public static void main(String args[]) { int[] tomb = {8, 5, 2, 9, 4, 3, 1, 6}; int meret = 8; gyors(tomb, 0, 7); for(int i=0; i Ez is helyben rendező, de listán dolgozik. import java.util.ArrayList; import java.util.Arrays; public class Program01 { static void quicksort(ArrayList list, int lo, int hi) { if(lo < hi) { int p = partition(list, lo, hi); quicksort(list, lo, p-1); quicksort(list, p+1, hi); } } static int partition(ArrayList list, int lo, int hi) { int pivot = list.get(hi); int i = lo -1; for (int j = lo; j < hi; j++) { if(list.get(j)<= pivot) { i++; swap(list, i, j); } } swap(list, i+1, hi); return i + 1; } static void swap(ArrayList list, int i, int j) { int tmp = list.get(i); list.set(i, list.get(j)); list.set(j, tmp); } static void kiir(ArrayList list) { for(Integer x : list) { System.out.print(x + " "); } System.out.println(); } public static void main(String[] args) { Integer[] t = {8, 2, 7, 3, 4, 9}; ArrayList list = new ArrayList<>(Arrays.asList(t)); quicksort(list, 0, list.size()-1); kiir(list); } } Ne felejtsük el, hogy a listáknak vannak saját rendező metódusaik is. ==== Shell rendezés ==== class Program { public static void main(String args[]) { int[] tomb = {8, 5, 2, 9, 4, 3, 1, 6}; int[] leptomb = {5, 3, 1}; int meret = 8; for(int k = 0; k< 3; k++) { int lepeskoz = leptomb[k]; for(int j = lepeskoz; j < meret; j++) { int i = j - lepeskoz; int kulcs = tomb[j]; while(i>=0 && tomb[i] > kulcs) { tomb[i + lepeskoz] = tomb[i]; i = i - lepeskoz; } tomb[i + lepeskoz] = kulcs; } } for(int i=0; i ===== Összefuttatás ===== ==== Összefuttatás, összefésülés ==== class Program01{ public static void main(String[] args) { int[] a = { 1, 3, 5, 7, 9}; int[] b = {2, 4, 6, 8 }; int[] c = new int[a.length+b.length]; int n = a.length; int m = b.length; int i = 0; int j = 0; int k = -1; while(i b[j]) { c[k] = b[j]; j++; } } while(i ===== Keresés rendezett tömbben ===== ==== Logaritmikus keresés ==== public class Program01 { public static void main(String[] args) { int[] t={3, 4, 6, 8, 18, 50, 52, 61, 68, 70}; int n = t.length; int e = 0; int u = n-1; int k; int ker = 52; do { k = (e+u) / 2; if(kert[k]) e = k+1; }while(e<=u && t[k]!=ker); boolean van = e<=u; int index = 0; if(van) { index = k; } System.out.printf("%s %d\n", van, index); } }