Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen der Seite angezeigt.
Beide Seiten, vorherige Überarbeitung Vorherige Überarbeitung Nächste Überarbeitung | Vorherige Überarbeitung | ||
faecher:informatik:oberstufe:algorithmen:sorting:radixsort:start [01.07.2025 05:47] – Frank Schiebel | faecher:informatik:oberstufe:algorithmen:sorting:radixsort:start [07.07.2025 19:01] (aktuell) – Frank Schiebel | ||
---|---|---|---|
Zeile 5: | Zeile 5: | ||
Radixsort sortiert die Elemente einer Liste, indem er sie nach einzelnen Ziffern (Stellenwerten) gruppiert, meistens beginnend mit der niederwertigsten Ziffer. Für jede Ziffer der zu sortierenden Zahlen wird ein sogenannter " | Radixsort sortiert die Elemente einer Liste, indem er sie nach einzelnen Ziffern (Stellenwerten) gruppiert, meistens beginnend mit der niederwertigsten Ziffer. Für jede Ziffer der zu sortierenden Zahlen wird ein sogenannter " | ||
- | Wichtige Eigenschaften: | + | |In der Animation kann man das Prinzip von Radix-Sort sehen.\\ Zunächst werden die Elemente entsprechend ihrer Einerstelle in die Buckets sortiert und anschließend wieder in das ursprüngliche Array zurück übernommen, |
+ | <iframe src=" | ||
+ | </ | ||
+ | |||
+ | Radixsort stellt **besondere Anforderungen an die zu sortierenden Elemente** (es muss eine Stellenweise, | ||
+ | |||
+ | **Weitere | ||
* Nicht-vergleichend: | * Nicht-vergleichend: | ||
Zeile 12: | Zeile 18: | ||
* Radixsort ist besonders effizient, wenn die Anzahl der Ziffern (bzw. die Schlüssellänge) im Vergleich zur Anzahl der Elemente klein ist | * Radixsort ist besonders effizient, wenn die Anzahl der Ziffern (bzw. die Schlüssellänge) im Vergleich zur Anzahl der Elemente klein ist | ||
- | < | + | ---- |
- | <div id=" | + | {{:aufgabe.png? |
- | <div v-bind: | + | === (A1) === |
- | < | + | |
- | < | + | |
- | <label class=" | + | |
- | <input type=" | + | |
- | {{ isStable }} | + | |
- | </ | + | |
- | </ | + | |
- | <button @click=" | + | |
- | <div id=" | + | |
- | <div id=" | + | |
- | <div v-for=" | + | |
- | <div class=" | + | |
- | {{ index }} | + | |
- | </ | + | |
- | < | + | |
- | <div v-for=" | + | |
- | class=" | + | |
- | : | + | |
- | ' | + | |
- | ' | + | |
- | }" | + | |
- | : | + | |
- | //width: 3+x.countValue*25 + ' | + | |
- | transition: 'all ' + delay | + | |
- | }"> | + | |
- | <span v-for=" | + | |
- | : | + | |
- | {{ digit }} | + | |
- | </ | + | |
- | </ | + | |
- | </ | + | |
- | </ | + | |
- | </ | + | |
- | <div id=" | + | |
- | < | + | |
- | <div v-for=" | + | |
- | : | + | |
- | class=" | + | |
- | : | + | |
- | ' | + | |
- | ' | + | |
- | }" | + | |
- | : | + | |
- | transition: 'all ' + delay | + | |
- | }" | + | |
- | > | + | |
- | <span v-for=" | + | |
- | : | + | |
- | {{ digit }} | + | |
- | </ | + | |
- | </ | + | |
- | </ | + | |
- | </ | + | |
- | </ | + | |
- | </ | + | |
- | </ | + | |
- | < | + | |
- | const app2 = Vue.createApp({ | + | |
- | data() { | + | |
- | return { | + | |
- | btnIsDisabled: | + | |
- | chbxDisabled: | + | |
- | msgDone: '', | + | |
- | inpVal: 200, | + | |
- | count: [], | + | |
- | dice: [], | + | |
- | keyNumber: 0, | + | |
- | keyNumber2: 0, | + | |
- | currentDigitPosition: | + | |
- | buttonText: 'Radix Sort', | + | |
- | stableBool: true | + | |
- | } | + | |
- | }, | + | |
- | computed: { | + | |
- | delay(){ | + | |
- | return 350 - this.inpVal; | + | |
- | }, | + | |
- | isStable() { | + | |
- | if(this.stableBool) { | + | |
- | return ' | + | |
- | } | + | |
- | else { | + | |
- | return ' | + | |
- | } | + | |
- | } | + | |
- | }, | + | |
- | watch: { | + | |
- | delay: { | + | |
- | immediate: true, | + | |
- | handler() { | + | |
- | this.updateMoveDuration(); | + | |
- | }, | + | |
- | } | + | |
- | }, | + | |
- | methods: { | + | |
- | newKey(){ | + | |
- | this.keyNumber2++; | + | |
- | return this.keyNumber2; | + | |
- | }, | + | |
- | action(){ | + | |
- | if(this.buttonText === "Radix Sort") { | + | |
- | this.radixSort(); | + | |
- | } | + | |
- | else { | + | |
- | this.addDie50(); | + | |
- | } | + | |
- | }, | + | |
- | updateMoveDuration() { | + | |
- | let stylesheets = document.styleSheets; | + | |
- | for (let i = 0; i < stylesheets.length; | + | |
- | let rules = stylesheets[i].cssRules | + | |
- | for (let j = 0; j < rules.length; | + | |
- | if (rules[j].selectorText === ' | + | |
- | rules[j].style.transitionDuration = this.delay + ' | + | |
- | break; | + | |
- | | + | |
- | | + | |
- | } | + | |
- | }, | + | |
- | async radixSort() { | + | |
- | this.btnIsDisabled | + | |
- | this.chbxDisabled | + | |
- | this.currentDigitPosition | + | |
- | await new Promise(resolve => setTimeout(resolve, | + | |
- | for(let k=0; k<3; k++){ | + | |
- | while(this.dice.length > 0) { | + | |
- | if(this.stableBool){ | + | |
- | this.dice[0].isActive | + | |
- | await new Promise(resolve | + | |
- | let removedObj = this.dice.splice(0, | + | |
- | removedObj.digits = String(removedObj.dieNmbr).split('' | + | |
- | let n = this.currentDigitPosition+1; | + | |
- | let digit = Math.floor(removedObj.dieNmbr / Math.pow(10, | + | |
- | this.count[digit].push(removedObj); | + | |
- | await new Promise(resolve => setTimeout(resolve, | + | |
- | await new Promise(resolve => setTimeout(resolve, | + | |
- | this.count[digit][this.count[digit].length-1].isActive = false; | + | |
- | } | + | |
- | else { | + | |
- | this.dice[this.dice.length-1].isActive = true; | + | |
- | await new Promise(resolve => setTimeout(resolve, | + | |
- | let removedObj = this.dice.pop(); | + | |
- | removedObj.digits = String(removedObj.dieNmbr).split('' | + | |
- | let n = this.currentDigitPosition+1; | + | |
- | let digit = Math.floor(removedObj.dieNmbr / Math.pow(10, | + | |
- | this.count[digit].push(removedObj); | + | |
- | await new Promise(resolve => setTimeout(resolve, | + | |
- | await new Promise(resolve => setTimeout(resolve, | + | |
- | this.count[digit][this.count[digit].length-1].isActive = false; | + | |
- | } | + | |
- | + | ||
- | } | + | |
- | await new Promise(resolve => setTimeout(resolve, | + | |
- | for(let i=this.count.length-1; | + | |
- | while(this.count[i].length> | + | |
- | this.count[i][this.count[i].length-1].isActive = true; | + | |
- | await new Promise(resolve => setTimeout(resolve, | + | |
- | let removedObj = this.count[i].pop(); | + | |
- | await new Promise(resolve => setTimeout(resolve, | + | |
- | this.dice.splice(0, | + | |
- | await new Promise(resolve => setTimeout(resolve, | + | |
- | await new Promise(resolve => setTimeout(resolve, | + | |
- | this.dice[0].isActive = false; | + | |
- | } | + | |
- | } | + | |
- | this.currentDigitPosition++; | + | |
- | await new Promise(resolve => setTimeout(resolve, | + | |
- | } | + | |
- | for(let i=0; i< | + | |
- | if(this.stableBool){ | + | |
- | this.dice[i].isFinished = true; | + | |
- | } | + | |
- | else { | + | |
- | this.dice[i].isActive = true; | + | |
- | } | + | |
- | } | + | |
- | await new Promise(resolve => setTimeout(resolve, | + | |
- | if(this.stableBool){ | + | |
- | this.msgDone = ' | + | |
- | } | + | |
- | else { | + | |
- | this.msgDone = 'Not sorted correctly!'; | + | |
- | } | + | |
- | this.buttonText = "New Values"; | + | |
- | this.btnIsDisabled = false; | + | |
- | }, | + | |
- | addDie() { | + | |
- | const newDie = { | + | |
- | dieNmbr: Math.ceil(Math.random() * 500)+100, | + | |
- | keyNmbr: this.keyNumber, | + | |
- | isActive: false, | + | |
- | isFinished: false | + | |
- | }; | + | |
- | this.dice.push(newDie); | + | |
- | this.keyNumber++; | + | |
- | }, | + | |
- | addDie50() { | + | |
- | this.chbxDisabled = false; | + | |
- | this.count = [[], | + | |
- | this.currentDigitPosition = 5; | + | |
- | this.dice = []; | + | |
- | for (let i = 0; i < 10; i++) { | + | |
- | this.addDie(); | + | |
- | } | + | |
- | this.buttonText = "Radix Sort"; | + | |
- | this.msgDone = ''; | + | |
- | this.stableBool = true; | + | |
- | } | + | |
- | }, | + | |
- | mounted() { | + | |
- | this.addDie50(); | + | |
- | this.updateMoveDuration(); | + | |
- | } | + | |
- | }); | + | |
- | app2.mount('# | + | |
- | </ | + | |
+ | Überlege, welche Eigenschaften die Elemente einer Liste haben müssen, wenn man sie mit Radix-Sort sortieren möchte. Gib weitere Beispiele an, die Listen beinhalten die dich aus zahlen bestehen. | ||
- | </ | + | ---- |
+ | {{: | ||
+ | === (A2) === | ||
+ | Implementiere Radix-Sort im Programmgerüst der entsprechenden Klasse in der Bluej-Vorlage von https:// | ||
+ | |||
+ | **A2.1** Betrachte zunächst den Konstruktor: | ||
+ | |||
+ | Kontrolliere deine Überlegung mit Hilfe entsprechender Eingaben, indem du das erzeugte Objekt untersuchst. | ||
+ | |||
+ | **A2.2** Als " | ||
+ | |||
+ | <code java> | ||
+ | // Buckets als Array aus ArrayLists erzeugen | ||
+ | ArrayList< | ||
+ | for(int i=0; i<10; i++) { | ||
+ | | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | '' | ||
+ | |||
+ | **A2.3** Implementiere die beiden Abschnitte " | ||
+ | |||
+ | **A2.4** Wiederhole den Verteilen/ | ||
+ | |||
+ | Du musst dir noch überlegen, wie du der Reihe nach Einer-, Zehner, Hunderter-Stelle ermitteln kannst, um bei jedem neuen Durchlauf in die passenden Buckets zu sortieren. | ||
+ | |||
+ | Außerdem musst du festlegen, wie oft diese äußere Schleife durchlaufen werden soll - '' | ||
+ | |||
+ | |||
+ | ++++ Lösungsvorschlag | | ||
+ | <code java> | ||
+ | // Radixsort sortiert die ArrayList | ||
+ | public void sort(ArrayList< | ||
+ | |||
+ | // Unsortiertes Array ausgeben | ||
+ | System.out.println(Arrays.toString(a.toArray())); | ||
+ | |||
+ | // Buckets als Array aus ArrayLists erzeugen | ||
+ | ArrayList< | ||
+ | for(int i=0; i<10; i++) { | ||
+ | bucket[i] = new ArrayList<> | ||
+ | } | ||
+ | |||
+ | for(int d=0 ; d< | ||
+ | int q=1; | ||
+ | for(int i=0; i<d; i++) { | ||
+ | q=q*10; | ||
+ | } | ||
+ | // Verteilen | ||
+ | for(int z=0; z< | ||
+ | int ziel_bucket = (a.get(z)/ | ||
+ | bucket[ziel_bucket].add(a.get(z)); | ||
+ | } | ||
+ | // Einsammeln | ||
+ | int pos = a.size()-1; | ||
+ | for(int b=9; b>=0; b--) { | ||
+ | while(!bucket[b].isEmpty()) { | ||
+ | a.set(pos, bucket[b].removeLast()); | ||
+ | pos--; | ||
+ | } | ||
+ | } | ||
+ | // Zwischen/ | ||
+ | System.out.println(Arrays.toString(a.toArray())); | ||
+ | } | ||
+ | |||
+ | } | ||
+ | </ | ||
+ | ++++ |