Selection Sort schnellere Variante

updater

Mitglied
Hey Leute,

Ich will die Selection Sort suche schneller machen, das heißt die Variante soll das Minimum und Maximum gleichzeitig bestimmen und dann mit dem Element ,dass am weitesten links bzw am weitesten rechts steht,vertauscht werden. D.h. die Restfolge wird von beiden Seiten her kleiner.

Bisher habe ich nur eine Variante , die nur das Maximum sucht und mit dem am weitesten rechts vertauscht wird.

Mein bisheriger Code:

Java:
public class Sort {

	static void swap (int [] array, int index1, int index2)

	{
	int tmp = array[index1];
	array[index1] = array[index2];
	array[index2] = tmp;
	}
	
	
	static void SelectionSort (int [] array) {
		int mark = array.length - 1;
		while (mark > 0) {
		
		int max = 0; 
		for (int i = 1; i <= mark; i++) 
		if (array [i] > array [max]) 
		max = i;
		swap (array, mark, max);
		
		mark--;
		}
		}
	public static void main(String[] args) {
		
		int [] F = new int[20];
		
		for (int i = 0; i<F.length; i++)
		{
			int key= (int) Math.floor(Math.random()*F.length);
			F[i] = key;}
		SelectionSort(F);
		int a=0;
		while (a<F.length){
			print(F[a] + ", ");
			a++;
		}
	}

}

Wie könnte ich das am besten umschreiben? Ich bin noch Neuling und habe es schon selbst versucht aber leider ohne Erfolg. Bei Google habe ich auch nichts passendes gefunden. Irgendwelche Ideen, Tipps oder sogar eine Lösung?

Danke schonmal im Vorraus

mfg

updater
 
Zuletzt bearbeitet:

Andi_CH

Top Contributor
Du umschreibst es ja schon!

dort wo du das Maximum suchst baust du zusätzlich noch den Code ein, der auch das Miniumum sucht
dort wo du das Maximum verschiebst baust du zusätzlich noch den Code ein der das Minimum verschiebt

Mit dem Vorlagen von Maximum suchen und Maximum verschieben ist sicher möglich nach kurzem Nachdenken zu lösen.

Lösung? Hm - lieber nicht, dann hättest du ja nichts gelernt :D
 

updater

Mitglied
Hey,

Erstmal Danke für deine schnelle Antwort

Ich habe es jetzt mal so umgeschrieben

Java:
static void SelectionSort (int [] array) {
		int marker = array.length - 1;
		while (marker > 0) {
		
		int max = 0; 
		int min = 0;
		
		for (int i = 1; i <= marker; i++) {
		if (array [i] > array [max]) 
		max = i;
		swap (array, marker, max);}
		
		for (int i = 1; i <= marker; i++) {
			if (array [i] < array [min]) 
			min = i;
			swap (array, marker, min);}
		
		marker--;
		}
		}

Nun gibt er mir aber das sortierte array rückwärts aus .
Bsp: 19, 19, 18, 18, 16, 15, 15, 15, 13, 9, 8, 6, 5, 4, 4, 3, 2, 1, 1, 0,
 

Andi_CH

Top Contributor
Uff - grober Fehler - Eine Methode darf nicht gleich heissen wie die Klasse - ausser sie ist ein Konstruktor --- betreffend umdrehen melde ich mich gleich

Sag doch einfach "sort" oder "doIt" oder sowas anstatt static void sort ....

Hm - was ist print?

Auch schon was von "for" loops gehört? ;-)
 

updater

Mitglied
Uff - grober Fehler - Eine Methode darf nicht gleich heissen wie die Klasse - ausser sie ist ein Konstruktor --- betreffend umdrehen melde ich mich gleich

Sag doch einfach "sort" oder "doIt" oder sowas anstatt static void sort ....

Hm - was ist print?

Auch schon was von "for" loops gehört? ;-)

Klasse heißt bei mir anders, hab sie hier nur umbenannt, sonst würde ich das Programm garnicht starten können, da der Compiler meckern würde.
"print" macht das selbe wie System.out.print();, aber das ist auch nebensächlich, das funktioniert schon.
 

Andi_CH

Top Contributor
Ich schnall das Verfahren nicht - sorry.
Quick and dirty Lösung ist den Array in umgekehrter Richtung auszugeben :D

Wie kommst du mit nur einem Marker über die Runde?
 
Zuletzt bearbeitet:

Andi_CH

Top Contributor
Ich gebs auf!
mir scheint es so, dass es reiner Zufall ist dass es funktioniert
- loops starten bei 1 statt 0

Wenn du zufrieden mit der quick and dirty Lösung bist, ok :)
 

updater

Mitglied
Ich gebs auf!
mir scheint es so, dass es reiner Zufall ist dass es funktioniert
- loops starten bei 1 statt 0

Wenn du zufrieden mit der quick and dirty Lösung bist, ok :)

Da muss irgendwo ein Denkfehler im Programmiercode sein. Ich glaube das Programm macht das nicht gleichzeitig sondern erst mit Maximum, dann mit Minimum. Kann jemand anderes helfen ???:L

Danke
 
Zuletzt bearbeitet:

Andi_CH

Top Contributor
Ich versuche noch immer das anfangsprogramm zu verstehen.

Also das mit start bei 1 ist ok, aber du kannst schon bei maxMarker - 1 abbrechen sonst tauscht der am Schluss noch n gegen n.

Das mit den Minima kannst du sicher nicht mit maxMarker lösen sondern musst einen min Marker bestimmen.

Die Frage ist einfach ob du dabei wirklich etwas gewinnst?
 

Andi_CH

Top Contributor
und den Abbruch könntest du auch noch optimieren

Schau mal!

Code:
4, 2, 3, 1, 
swap 3, 0
1, 2, 3, 4,  <- hier könnte man abbrechen! 
swap 2, 1
1, 3, 2, 4, 
swap 1, 0
3, 1, 2, 4, 
3, 1, 2, 4,
 

updater

Mitglied
Ich versuche noch immer das anfangsprogramm zu verstehen.

Also das mit start bei 1 ist ok, aber du kannst schon bei maxMarker - 1 abbrechen sonst tauscht der am Schluss noch n gegen n.

Das mit den Minima kannst du sicher nicht mit maxMarker lösen sondern musst einen min Marker bestimmen.

Die Frage ist einfach ob du dabei wirklich etwas gewinnst?

Ja, es müsste schneller gehen ,da in einem Durchlauf sowohl der kleinste als auch der größte Wert ermittelt wird und dann mit dem am weitesten links bzw. am weitesten rechts stehenden Element vertauscht wird. Dadurch wird die zu betrachtende Restfolge von beiden Seiten her kleiner.

EDIT:

Ja optimieren könnt ich es noch, aber erst wenn der Code stimmt. Ich versuchs mal weiter :bahnhof:
 
Zuletzt bearbeitet:

Landei

Top Contributor
Vorschlag: Schreibe dir erst mal einen Test. Sonst bist du nie sicher, ob es richtig läuft.

Ich versuche mal aus'm Kopp (JUnit wäre besser, aber kann man ja noch ummodeln):
Java:
import java.util.*;
class SortTest {

   private static Random random = new Random();
   public static void test() {
       for(int anzahlTests = 0; anzahlTests < 100; anzahlTests++) {
           int len = 3 + random.nextInt(10); 
           int[] selectionSortArray = new int[len];
           int[] javaSortedArray = new int[len];
           for(int i = 0; len; i++) {
               int r = random.nextInt(20);
               selectionSortArray[i] = r;
               javaSortedArray[i] = r;
           } 
           DeineKlasse.selectionSort(selectionSortArray);
           Arrays.sort(javaSortedArray);
           if(! Arrays.equals(selectionSortArray,javaSortedArray)) {
               System.err.println("WTF? " + Arrays.toString(selectionSortArray));
           }
       }
   }
}
 

Andi_CH

Top Contributor
Ja, es müsste schneller gehen ,da in einem Durchlauf sowohl der kleinste als auch der größte Wert ermittelt wird und dann mit dem am weitesten links bzw. am weitesten rechts stehenden Element vertauscht wird. Dadurch wird die zu betrachtende Restfolge von beiden Seiten her kleiner.

EDIT:

Ja optimieren könnt ich es noch, aber erst wenn der Code stimmt. Ich versuchs mal weiter :bahnhof:

Ich würde erst einmal den Originalcode mit nur einer Vertauschung optimieren und der läuft ja mehr oder weniger - allerdings ist es schon seltsam, dass fröhlich weitervertauscht wrid, obwohl der Array ja im obigen Beispiel nach dem ersten Vertauschen sortiert ist....

... und dann auf Papier aufzeichnen was wann wie vertauscht werden muss

Alles in allem ist das kein Java-Problem und es ist fraglich in wie weit das hier das richtig Forum ist.
 

updater

Mitglied
Ich würde erst einmal den Originalcode mit nur einer Vertauschung optimieren und der läuft ja mehr oder weniger - allerdings ist es schon seltsam, dass fröhlich weitervertauscht wrid, obwohl der Array ja im obigen Beispiel nach dem ersten Vertauschen sortiert ist....

... und dann auf Papier aufzeichnen was wann wie vertauscht werden muss

Alles in allem ist das kein Java-Problem und es ist fraglich in wie weit das hier das richtig Forum ist.

Erstmal danke für eure Hilfe! Ich denke du hast recht ,dass das kein Java Problem ist, deshalb werde ich den Thread schließen. Falls ich die Lösung habe, werde ich sie noch posten.

mfg
updater
 

Stapf_JAVA

Mitglied
Java:
    public int[] sortieren(int[] folge){
        int rightbound = folge.length-1;
        int leftbound=0;
        int i; //Laufindex

        while(rightbound>leftbound){
            for(i=leftbound; i<rightbound; i++){ //Maximum suchen
                if(folge[i]>folge[i+1]){
                    folge = elementeTauschen(i, i+1, folge);//tauschen nach rechts
                }//END if
            }//END for
            for(i=rightbound; i>leftbound; i--){//Minimum suchen
                if(folge[i]<folge[i-1]){
                    folge = elementeTauschen(i-1, i, folge);//tauschen nach links
                }//END if
            }//END for
            rightbound--;
            leftbound++;
        }//END while

        return folge;

    }//END sortieren





    public int[] elementeTauschen(int index,int index2, int[] folge){
        int tmp = 0;
        tmp = folge[index2];
        folge[index2] = folge [index];
        folge[index] = tmp;

        return folge;


    }//END elementeTauschen
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
KogoroMori21 Textdatei einlesen im Array (Selection Sort Algorithmus) Java Basics - Anfänger-Themen 3
Marc111111111 Selection Sort in Java?? Java Basics - Anfänger-Themen 6
J Fehler im Selection Sort Java Basics - Anfänger-Themen 5
B 2 dimensionales Array: Selection Sort Java Basics - Anfänger-Themen 4
N Selection Sort Problem Java Basics - Anfänger-Themen 19
J Liste von Integers mit Selection Sort sortieren Java Basics - Anfänger-Themen 3
B Selection sort Java Basics - Anfänger-Themen 33
E Selection Sort für beliebige Objekte Java Basics - Anfänger-Themen 24
T Selection-Sort-Algorithmus Java Basics - Anfänger-Themen 9
I Selection-Sort // Array *help* Java Basics - Anfänger-Themen 2
J Selection Sort in Liste implementieren Java Basics - Anfänger-Themen 3
0 Selection Sort funktioniert nicht. Java Basics - Anfänger-Themen 3
N Selection Algorithmus: Methode wird nicht erkannt (BlueJ) Java Basics - Anfänger-Themen 3
Salo JTabel Selection listener Bsp. Java Basics - Anfänger-Themen 3
M The Selection cannot be launched... Java Basics - Anfänger-Themen 4
S Selection does not contain a main type! Java Basics - Anfänger-Themen 5
S Selection does not contain a main type Java Basics - Anfänger-Themen 12
T selection method does not contain a main type Java Basics - Anfänger-Themen 7
F JTable speichern, Fehler bei Selection Java Basics - Anfänger-Themen 3
K Erste Schritte selection does not contain a main type Java Basics - Anfänger-Themen 3
J "this selection cannot be launched..." eclipse fehlermeldung Java Basics - Anfänger-Themen 7
V Eclipse "Selection does not contain a main type" Java Basics - Anfänger-Themen 13
I deselect oder Selection aufheben Java Basics - Anfänger-Themen 2
B Selection does not contain a main type Java Basics - Anfänger-Themen 2
S jList Multiple Selection mit Klick Java Basics - Anfänger-Themen 2
T Auf Selection warten Java Basics - Anfänger-Themen 7
R JPopupMenu + single selection Java Basics - Anfänger-Themen 8
emreiu Formatiertes Output bei Insertion Sort Java Basics - Anfänger-Themen 6
O Sortieren mit Insertion Sort Java Basics - Anfänger-Themen 3
Tw1Z Erste Schritte Sort in java Java Basics - Anfänger-Themen 2
M Bubble Sort - Int[] Array sortieren Java Basics - Anfänger-Themen 2
X Collections.sort als Lambda Java Basics - Anfänger-Themen 14
berserkerdq2 Geht collections.sort bei allen? Linkedhashset, ArrayList, HashSet etc. Java Basics - Anfänger-Themen 4
L Insertion Sort bei zweidimensionalem Array Java Basics - Anfänger-Themen 7
G Insertion Sort mit Aray Java Basics - Anfänger-Themen 5
O Collections.sort und List.sort mit Lambda Verwirrung Java Basics - Anfänger-Themen 5
B Collections.sort mit zwei Bedingungen? Java Basics - Anfänger-Themen 4
M Collection.sort sortiert nicht Java Basics - Anfänger-Themen 7
CptK Best Practice Merge-Sort als Baum darstellen Java Basics - Anfänger-Themen 3
P Java Bubble Sort,Anfängerfehler Java Basics - Anfänger-Themen 4
S Methoden Sort Array Java Basics - Anfänger-Themen 9
I Erste Schritte sort() vs. sort() Java Basics - Anfänger-Themen 9
BadBat ArrayList<String> sort by last word Java Basics - Anfänger-Themen 8
U Methoden Zweidimensionales Array mit Arrays.sort sortieren? Java Basics - Anfänger-Themen 22
X Quick Sort - Vergleichsoperationen zählen Java Basics - Anfänger-Themen 0
O Insertion Sort Java Basics - Anfänger-Themen 4
N Bubble Sort sortieren mit Int Werte Java Basics - Anfänger-Themen 8
C OOP array Sortieren ohne den sort Befehl Java Basics - Anfänger-Themen 10
S int-Array mittels Arrays.sort() in einer Schleife sortieren. Java Basics - Anfänger-Themen 2
N Schlüsselworte Bubble Sort nach eigener Ordnung Java Basics - Anfänger-Themen 8
O Listen sort-Methode Java Basics - Anfänger-Themen 1
M Quick Sort Java Basics - Anfänger-Themen 4
V Heap-Sort Java Basics - Anfänger-Themen 0
M Methoden Quick Sort Java Basics - Anfänger-Themen 5
T array.sort mit zwei Kriterien Java Basics - Anfänger-Themen 8
S Liste und Bubble Sort Java Basics - Anfänger-Themen 4
H Collections Was ist schneller - HashMap + Sort v TreeMap? Java Basics - Anfänger-Themen 75
S Fehler bei Arrays.sort(array) - Methode!? Java Basics - Anfänger-Themen 3
P collections.sort Java Basics - Anfänger-Themen 2
B Arrays.sort Java Basics - Anfänger-Themen 4
P schneller Sort ? Java Basics - Anfänger-Themen 2
S Bubble Sort Java Basics - Anfänger-Themen 5
B Merge-Sort Analyse Java Basics - Anfänger-Themen 27
K Array.sort() Java Basics - Anfänger-Themen 12
H Etwas wie sort() / sorted() in JAVA-Collections? Java Basics - Anfänger-Themen 5
F Methoden Insert Sort Fehler Java Basics - Anfänger-Themen 10
P Ein sort problem Java Basics - Anfänger-Themen 6
S Bubble Sort Algorithmus Java Basics - Anfänger-Themen 3
Spin sort tokens - somebody knows a better solution? Java Basics - Anfänger-Themen 13
B Strings alphabentisch sortieren mit Hilfe von insertion sort Java Basics - Anfänger-Themen 6
P Array.sort // Arrays ausgeben Java Basics - Anfänger-Themen 21
S String sortieren mit Interface und sort() Java Basics - Anfänger-Themen 6
F Arrays.sort( ) Problem Java Basics - Anfänger-Themen 14
Dit_ Collections.sort(..); | Anwendung Java Basics - Anfänger-Themen 4
N java.util.Arrays.sort Warum sind Leerzeichen vor alphabetischen Zeichen sortiert? Java Basics - Anfänger-Themen 12
D Insertion sort auf eine liste Java Basics - Anfänger-Themen 4
X Counting Sort Java Basics - Anfänger-Themen 5
P Problem mit Insertion Sort Java Basics - Anfänger-Themen 4
G Quick Sort - bin ich zu blöd? Java Basics - Anfänger-Themen 7
D sort.exe über java aufrufen Java Basics - Anfänger-Themen 2
V Bubble Sort endet in Endlosschleife Java Basics - Anfänger-Themen 4
S Collection<Typ> sort Java Basics - Anfänger-Themen 4
hedges Insertion Sort Algorithmus problem Java Basics - Anfänger-Themen 18
N Collections Sort ArrayList<> Java Basics - Anfänger-Themen 7
K Arrays.sort() Java Basics - Anfänger-Themen 2
S Collection Sort Java Basics - Anfänger-Themen 15
O Arrays und sort Java Basics - Anfänger-Themen 4
G sort(int[] a, int fromIndex, int toIndex) Java Basics - Anfänger-Themen 5
F Klassenmethode Arrays.sort(Object[]a) Java Basics - Anfänger-Themen 2
H Bubble sort array Java Basics - Anfänger-Themen 12
M Bubble-Sort und null Werte Java Basics - Anfänger-Themen 4
G Zählen von Zuweisungen bei Bubble Sort Java Basics - Anfänger-Themen 3
I Methode Arrays.sort(Object[] arr) Java Basics - Anfänger-Themen 19
K compareTo in Verbinug mit Arrays.sort() Java Basics - Anfänger-Themen 4
D Frage zu Collection.sort bzw. Comparator u. Comparable Java Basics - Anfänger-Themen 2
U Array.sort auf variable Array-Größe anwenden Java Basics - Anfänger-Themen 3
D Mit java.util.Arrays.sort die negativen Zahlen hinten Java Basics - Anfänger-Themen 4
D Collections.sort() frage Java Basics - Anfänger-Themen 6
V Sortieren mit Bubble-Sort Java Basics - Anfänger-Themen 5
G Arrays.sort() will nicht sortieren Java Basics - Anfänger-Themen 8

Ähnliche Java Themen

Neue Themen


Oben