Luennolla 9.11.1998 lupailin julkistaa "salaa" muutamia mielettömiä järjestämisalgoritmeja. Tässä siis niitä. Havainnollistavat ehkä keskeytyslauseen (break) ja etenemislauseen (continue) käyttöä?
public class SatunnaisJarj {
private static long satunnaisJarjesta(int[] taulu) {
int i;
long kertoja = 0;
while (true) {
for (i=0; i < taulu.length-1; ++i)
if (taulu[i] > taulu[i+1])
break; // ei ollut järjestyksessä
if (i==taulu.length-1)
return kertoja; // valmis!
int eka = (int)(Math.random()*taulu.length);
int toka = (int)(Math.random()*taulu.length);
int apu = taulu[eka];
taulu[eka] = taulu[toka];
taulu[toka] = apu;
++kertoja;
}
}
public static void main(String[] args) { // testipääohjelma
int[] a = {40, 20, 50, 10, 30};
for (int i=0; i<a.length; ++i)
System.out.print(a[i]+" ");
System.out.println();
System.out.println("Vaihdettiin "+satunnaisJarjesta(a)+ " kertaa");
for (int i=0; i<a.length; ++i)
System.out.print(a[i]+" ");
System.out.println();
int[] b = new int[10];
for (int i=0; i<b.length; ++i)
b[i] = (int)(300*Math.random()); // vrt. harj. 15
for (int i=0; i<b.length; ++i)
System.out.print(b[i]+" ");
System.out.println();
System.out.println("Vaihdettiin "+satunnaisJarjesta(b)+ " kertaa");
for (int i=0; i<b.length; ++i)
System.out.print(b[i]+" ");
System.out.println();
}
}
public class SatunnaisKuplaJarj {
private static long satunnaisKuplaJarjesta(int[] taulu) {
int i;
long kertoja = 0;
while (true) {
for (i=0; i < taulu.length-1; ++i)
if (taulu[i] > taulu[i+1])
break; // ei ollut järjestyksessä
if (i==taulu.length-1)
return kertoja; // valmis!
int ind = (int)(Math.random()*(taulu.length-1));
int apu = taulu[ind];
taulu[ind] = taulu[ind+1];
taulu[ind+1] = apu;
++kertoja;
}
}
public static void main(String[] args) { // testipääohjelma
int[] a = {40, 20, 50, 10, 30};
for (int i=0; i<a.length; ++i)
System.out.print(a[i]+" ");
System.out.println();
System.out.println("Vaihdettiin "+satunnaisKuplaJarjesta(a)+ " kertaa");
for (int i=0; i<a.length; ++i)
System.out.print(a[i]+" ");
System.out.println();
int[] b = new int[10];
for (int i=0; i<b.length; ++i)
b[i] = (int)(300*Math.random()); // vrt. harj. 15
for (int i=0; i<b.length; ++i)
System.out.print(b[i]+" ");
System.out.println();
System.out.println("Vaihdettiin "+satunnaisKuplaJarjesta(b)+ " kertaa");
for (int i=0; i<b.length; ++i)
System.out.print(b[i]+" ");
System.out.println();
}
}
public class LottoJarj {
private static long lottoJarjesta(int[] taulu, int yläraja) {
int arvontakertojenMäärä=0;
yritäUudelleenAlusta:
while (true) {
++arvontakertojenMäärä;
// arvotaan taulukkotarjokas:
int[] yritys = new int[taulu.length];
for (int i=0; i<yritys.length; ++i)
yritys[i] = (int)(yläraja*Math.random());
// sattuuko tarjokas olemaan järjestyksessä?:
for (int i=0; i < yritys.length-1; ++i)
if (yritys[i] > yritys[i+1]) // järjestysvirhe!
continue yritäUudelleenAlusta;
// oli järjestyksessä!
// vaan sattuuko löytymään oikeat arvot?:
boolean [] oliJo = new boolean[taulu.length]; // ovat alussa false
etsiSeuraavaa:
for (int i=0; i < taulu.length; ++i)
for (int j=0; j < yritys.length; ++j)
if (taulu[i]==yritys[j] && !oliJo[j]) {
oliJo[j] = true;
continue etsiSeuraavaa;
}
for (int i=0; i<oliJo.length; ++i)
if (!oliJo[i])
continue yritäUudelleenAlusta;
// jos tänne päästiin, taulukko on saatu "järjestettyä",
// kopioidaan tulos parametritaulukkoon:
for (int i=0; i < taulu.length; ++i)
taulu[i] = yritys[i];
return arvontakertojenMäärä;
}
}
public static void main(String[] args) { // testipääohjelma
int[] järjestettävä = new int[5];
for (int i=0; i<järjestettävä.length; ++i)
järjestettävä[i] = (int)(10*Math.random()); // vain lukuja 0...9
for (int i=0; i<järjestettävä.length; ++i)
System.out.print(järjestettävä[i]+" ");
System.out.println();
System.out.println("Taulukko arvottiin "
+lottoJarjesta(järjestettävä, 10)+ " kertaa");
for (int i=0; i<järjestettävä.length; ++i)
System.out.print(järjestettävä[i]+" ");
System.out.println();
}
}