Gyakorlati alapok

Bugyborékrendezések

 

Az algoritmust működtető egyik fontos kódrészletről már tanulhattunk a Hogyan cseréljünk meg kezeinkben 2 teli poharat? (adatcserebere) című fejezetben. Javaslatom, hogy a kód tanulmányozása előtt ezt a fejezetet nézzük át.

 

A buborékrendezés során -hasonlóan a pezsgőpohárban látható, folyamatosan felfelé áramló szénsavbuborékokhoz-, a mindenkori legnagyobb tömbelem szállingózik fel a tömb legtetejére. Ehhez mindig a szomszédos elemeket hasonlítjuk össze és csere esetén a nagyobb elem kerül feljebb. A rendezés tehát mindig egyre szűkebb tömbelem-tartományt érint.

 

www.informatika-programozas.hu - Ezt most meg kell tanulni!

 

Ám éppen aprólékossága miatt a buborékrendezés nem hatékony rendezési mód, mert műveletigénye a tömbméret négyzetével arányos.

 

Nézzük meg futtatható Java-kódos változatát:

 

www.informatika-programozas.hu - Futtatható Java-kód!

 

 

 

 

 

 

 

 

import java.util.Random;

public class Main {
    public static void main(String[] args) {
        Random rnd = new Random();
        int [] tomb = new int[10];

        for(int i = 0; i < tomb.length; i++){
            tomb[i] = rnd.nextInt(50) + 1;
            System.out.print(tomb[i] + " ");
        }

        System.out.println();

        for(int i = tomb.length-1; i > 0; i--)
            for(int j = 0; j < i; j++)
                if(tomb[j] > tomb[j+1]){
                    int tarolo = tomb[j];
                    tomb[j] = tomb[j+1];
                    tomb[j+1] = tarolo;
                }

    for(int i = 0; i < tomb.length; i++)
        System.out.print(tomb[i] + " ");
    }
}

 

Végeredmény (például):
35 7 11 13 37 40 19 39 29 14
7 11 13 14 19 29 35 37 39 40

 

Forrás - Source: wiki.prog.hu

Az algoritmus hatékonysága javítható, ha bevezetünk egy flag-et (Az állapotjelzők (flag) című fejezet), amely azt figyeli, hogy a belső ciklusban volt-e csere, hiszen csakis ebben az esetben érdemes a külső ciklusnak tovább futnia.

 

www.informatika-programozas.hu - Futtatható Java-kód!

 

 

 

 

 

 

 

 

import java.util.Random;

public class Main {
    public static void main(String[] args) {
        Random rnd = new Random();
        int [] tomb = new int[10];
        boolean csere = true;

        for(int i = 0; i < tomb.length; i++){
            tomb[i] = rnd.nextInt(50) + 1;
            System.out.print(tomb[i] + " ");
        }

        System.out.println();

        for(int i = tomb.length-1; i > 0 && csere; i--){
            csere = false;
            for(int j = 0; j < i; j++){
                if(tomb[j] > tomb[j+1]){
                    int tarolo = tomb[j];
                    tomb[j] = tomb[j+1];
                    tomb[j+1] = tarolo;
                    csere = true;
                }
            }
        }
        for(int i = 0; i < tomb.length; i++)
            System.out.print(tomb[i] + " ");
    }
}

 

Végeredmény (például):
35 7 11 13 37 40 19 39 29 14
7 11 13 14 19 29 35 37 39 40

 

Forrás - Source: wiki.prog.hu

Az algoritmus hatékonysága egy másik módszerrel is javítható: egy segédváltozó bevezetésével (int aktualisPozicio) megjegyezzük az utolsó cserélt elem tömbpozícióját és a következő ciklus már csak eddig fog tartani.

 

www.informatika-programozas.hu - Futtatható Java-kód!

 

 

 

 

 

 

 

 

import java.util.Random;

public class Main {
    public static void main(String[] args) {
        Random rnd = new Random();
        int [] tomb = new int[10];
        int i, aktualisPozicio;

        for(i = 0; i < tomb.length; i++){
            tomb[i] = rnd.nextInt(50) + 1;
            System.out.print(tomb[i] + " ");
        }

        System.out.println();

        i = tomb.length - 1;
        while(i >= 1){
            aktualisPozicio = 0;
            for(int j = 0; j < i; j++){
                if(tomb[j] > tomb[j+1]){
                    int tarolo = tomb[j];
                    tomb[j] = tomb[j+1];
                    tomb[j+1] = tarolo;
                    aktualisPozicio = j;
                }
            }
            i = aktualisPozicio;
        }
        for(i = 0; i < tomb.length; i++)
            System.out.print(tomb[i] + " ");
    }
}

 

Végeredmény (például):
8 20 45 28 1 28 38 42 2 9
1 2 8 9 20 28 28 38 42 45