[[: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);
}
}