{"id":4065,"date":"2024-11-17T17:47:59","date_gmt":"2024-11-17T16:47:59","guid":{"rendered":"https:\/\/www.capri-soft.de\/blog\/?p=4065"},"modified":"2024-11-27T09:08:08","modified_gmt":"2024-11-27T08:08:08","slug":"algorithmen-und-datenstrukturen-der-radix-sort-in-java","status":"publish","type":"post","link":"https:\/\/www.capri-soft.de\/blog\/?p=4065","title":{"rendered":"Algorithmen und Datenstrukturen: Der Radix Sort in Java"},"content":{"rendered":"\n<h2 class=\"wp-block-heading\">Der Algorithmus<\/h2>\n\n\n\n<p>Der Radix Sort-Algorithmus sortiert Zahlensysteme anhand ihrer Stellen. Der Radix Sort wird daher auch Base Sort genannt. Dies bedeutet, dass je Stelle ein eigenes Sortierverfahren (zumeist Counting Sort weil Wertebereich \u00fcberschaubar) eingesetzt wird. Man w\u00fcrde also bei 3 Stellen auch 3x sortieren.<\/p>\n\n\n\n<p>Es gibt einen Most- und Least-Significant-Radix-Sort (MSD \/ LSD Radix Sort). LSD beginnt bei der niedrigsten Stelle (z.B. den Einern) und bewegt sich zu den h\u00f6heren Stellen (z.B. Zehner, Hunderter). Bei MSD Radix Sort ist das umgekehrt.<\/p>\n\n\n\n<p>Eine wichtige Voraussetzung ist, das man die gleiche Anzahl an Stellen hat (also z.B. 2 (Tupel), 3 (Tripel) oder mehr Stellen). Weiterhin m\u00fcssen die vorhandenen Elemente in dem Zahlensystem (z.B. Dezimal 0-9) in einer Reihenfolge nach Rang sortierbar sein. D.h. es sollte z.B. klar sein dass ein A vor einem B ist (z.B. durch ASCII-Werte).<\/p>\n\n\n\n<p>Nehmen wir an, wir m\u00f6chten die Zahlen [170, 45, 75, 90, 802, 24, 2, 66] sortieren:<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">LSD Radix Sort (von rechts nach links):<\/h4>\n\n\n\n<ol start=\"1\" class=\"wp-block-list\">\n<li><strong>Sortierung nach der 1er-Stelle<\/strong>: [170, 90, 802, 2, 24, 45, 75, 66]<\/li>\n\n\n\n<li><strong>Sortierung nach der 10er-Stelle<\/strong>: [802, 2, 24, 45, 66, 170, 75, 90]<\/li>\n\n\n\n<li><strong>Sortierung nach der 100er-Stelle<\/strong>: [2, 24, 45, 66, 75, 90, 170, 802]<br><br><strong>Anwendung<\/strong>: Oft bei der Sortierung von Zahlen und W\u00f6rtern verwendet.<br><strong>Vorteil<\/strong>: Einfacher zu implementieren und erfordert weniger komplexe Vergleiche.<\/li>\n<\/ol>\n\n\n\n<h4 class=\"wp-block-heading\">MSD Radix Sort (von links nach rechts):<\/h4>\n\n\n\n<ol start=\"1\" class=\"wp-block-list\">\n<li><strong>Sortierung nach der 100er-Stelle<\/strong>: [170, 24, 2, 45, 66, 75, 802, 90]<\/li>\n\n\n\n<li><strong>Sortierung nach der 10er-Stelle<\/strong>: [2, 24, 45, 66, 75, 90, 170, 802]<\/li>\n\n\n\n<li><strong>Sortierung nach der 1er-Stelle<\/strong>: [2, 24, 45, 66, 75, 90, 170, 802]<br><br><strong>Anwendung<\/strong>: Eignet sich gut f\u00fcr gro\u00dfe Zahlenmengen oder lange Zeichenketten.<br><strong>Vorteil<\/strong>: Kann effizienter sein, wenn die Daten ungleichm\u00e4\u00dfig verteilt sind.<\/li>\n<\/ol>\n\n\n\n<h2 class=\"wp-block-heading\">Code von LSD Radix Sort<\/h2>\n\n\n\n<p>Der folgende Code hat die vergangenen Implementierungen von QuickSort und Counting Sort (ohne Stellensortierung durch Radix \/ Base Sort) mit einer Zeitmessung in Echtzeit verglichen und muss angepasst werden. Das nachfolgende Beispiel sortiert Dezimalzahlen (also ein Zahlensystem zur Basis 10).<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: java; title: ; notranslate\" title=\"\">\npackage AlgoDat;\n\nimport java.util.Arrays;\n\npublic class RadixSort {\n    \/\/ Zu sortierendes Array\n    private static int myArrayRadixSort&#x5B;] = {22, 6, 2, 4, 10, 3, 9, 7, 5, 8, 1};\n    \n    public boolean verbose = false;\n\n    \/\/ H\u00e4lt die Klassen als instanziertes Objekt\n    @SuppressWarnings(&quot;unused&quot;)\n    private static RadixSort programRadixSort;\n    @SuppressWarnings(&quot;unused&quot;)\n    private static HelperUtil helper;\n\n    \/\/ Hilfsfunktion f\u00fcr das Ausgeben des Arrays\n    public void OutputOfIntArray(int myArray&#x5B;])\n    {\n        if (myArray != null)\n        {\n            for (int i = 0; i &lt; myArray.length; i++) {\n                if (i &gt; 0) System.out.print(&quot;;&quot;);\n                System.out.print(myArray&#x5B;i]);\n            }\n\n            System.out.println();\n        }\n    }\n\n    public void radixSort(int&#x5B;] arr) \n    { \n        int max = Arrays.stream(arr).max().getAsInt();\n        if (verbose) System.out.println(&quot;Gr\u00f6\u00dfte Zahl im Array: &quot; + max);\n        \n        \/\/ Bei Dezimalzahlen muss die Basis 10 genommen werden\n        \/\/ ... bei Gro\u00dfbuchstaben z.B. die Basis 27\n        for (int exp = 1; max \/ exp &gt; 0; exp *= 10) \n        { \n            if (verbose) System.out.println(&quot;Suche &quot; + exp + &quot;er.&quot;);\n            countingSort(arr, exp); \n        } \n    } \n    \n    public void countingSort(int&#x5B;] arr, int exp) \n    { \n        int n = arr.length; \n        int&#x5B;] output = new int&#x5B;n]; \n        int&#x5B;] count = new int&#x5B;10]; \n        \n        \/\/ Alle 10 Elemente mit 0 initialisieren\n        for (int i = 0; i &lt; 10; i++) \n        { \n            count&#x5B;i] = 0; \n        } \n        \n        \/\/ Histogramm erstellen\n        for (int i = 0; i &lt; n; i++) \n        { \n            count&#x5B;(arr&#x5B;i] \/ exp) % 10]++; \n        } \n        \n        \/\/ Kummuliere, so dass die Anfangspositionen in dem Array stehen\n        for (int i = 1; i &lt; 10; i++) \n        { \n            count&#x5B;i] += count&#x5B;i - 1]; \n        } \n        \n        \/\/ Ausgabearray erstellen\n        for (int i = n - 1; i &gt;= 0; i--) \n        { \n            output&#x5B;count&#x5B;(arr&#x5B;i] \/ exp) % 10] - 1] = arr&#x5B;i]; \n            count&#x5B;(arr&#x5B;i] \/ exp) % 10]--; \n        } \n        \n        \/\/ Kopiere das neu erstellte Array auf das zu \u00e4ndernde Array\n        for (int i = 0; i &lt; n; i++) \n        { \n            arr&#x5B;i] = output&#x5B;i]; \n        } \n    } \n    \n    \/\/ Konstruktor\n    public RadixSort(int&#x5B;] toSort)\n    {\n        this.radixSort(toSort);\n    }\n\n    \/\/ Konstruktor\n    public RadixSort()\n    {\n        System.out.print(&quot;Vorher: &quot;);\n        this.OutputOfIntArray(myArray);\n\n        this.radixSort(myArray); \n        \n        System.out.print(&quot;Nachher: &quot;);\n        this.OutputOfIntArray(myArray);\n    }\n\n    public static void main(String&#x5B;] args) \n    {\n        helper = new HelperUtil();\n\n        \/\/ Es gibt 80 Mio Menschen in Deutschland, von denen keiner \u00e4lter als 120 ist -&gt; Kleiner Wertebereich\n        int&#x5B;] alterDerMenschenInDeutschlandRS = helper.generateIntegerArrayOfSize(80000000, 120);\n        int&#x5B;] alterDerMenschenInDeutschlandQS = alterDerMenschenInDeutschlandRS.clone();\n        int&#x5B;] alterDerMenschenInDeutschlandCS = alterDerMenschenInDeutschlandRS.clone();\n        \/\/ Erwartung: Da Counting Sort eine lineare Laufzeit hat sollte er bei kleinem Wertebereich am Besten performen\n        \n        System.out.println(&quot;\\nEs gibt 80 Mio Menschen in Deutschland, von denen keiner \u00e4lter als 120 ist -&gt; Kleiner Wertebereich&quot;);\n        System.out.println(&quot;===================================================================&quot;);\n        \n        long startZeitRS = System.nanoTime();\n        programRadixSort = new RadixSort(alterDerMenschenInDeutschlandRS);\n        long endZeitRS = System.nanoTime();\n        System.out.println((endZeitRS-startZeitRS) + &quot; ns (Radix Sort)&quot;);\n    }\n}\n<\/pre><\/div>\n\n\n<h2 class=\"wp-block-heading\">Ausgabe<\/h2>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\nEs gibt 80 Mio Menschen in Deutschland, von denen \nkeiner \u00e4lter als 120 ist -&gt; Kleiner Wertebereich\n=======================================================\n347584000 ns (Counting Sort)\n2544168000 ns (Radix Sort)\n3335958900 ns (Quick Sort)\n<\/pre><\/div>\n\n\n<h2 class=\"wp-block-heading\">Komplexit\u00e4t: O-Notation (Ordnung)<\/h2>\n\n\n\n<p><strong>O(n*l) <\/strong>(l=L\u00e4nge also bei ABC = L\u00e4nge: 3 &#8211; Anzahl der max. Stellen0)<br>\u2023 Sortieren von Strings \u00fcber einem endlichen Alphabet durch<br>mehrmaliges Anwenden von Counting Sort.<br>\u2023 Angenommen: Alle W\u00f6rter haben die L\u00e4nge<br>\u2023 Z.b. Postleitzahlen<\/p>\n\n\n\n<p>Laufzeit von Radix Sort: \ud835\udcaa(n), weil l \u22c5 n Durchl\u00e4ufe<\/p>\n<iframe src=\"http:\/\/www.facebook.com\/plugins\/like.php?href=https%3A%2F%2Fwww.capri-soft.de%2Fblog%2F%3Fp%3D4065&amp;layout=standard&amp;show_faces=true&amp;width=450&amp;action=like&amp;colorscheme=light\" scrolling=\"no\" frameborder=\"0\" allowTransparency=\"true\" style=\"border:none; overflow:hidden; width:450px;margin-top:5px;\"><\/iframe>","protected":false},"excerpt":{"rendered":"<p>Der Algorithmus Der Radix Sort-Algorithmus sortiert Zahlensysteme anhand ihrer Stellen. Der Radix Sort wird daher auch Base Sort genannt. Dies bedeutet, dass je Stelle ein eigenes Sortierverfahren (zumeist Counting Sort weil Wertebereich \u00fcberschaubar) eingesetzt wird. Man w\u00fcrde also bei 3 Stellen auch 3x sortieren. Es gibt einen Most- und Least-Significant-Radix-Sort (MSD \/ LSD Radix Sort). &hellip; <a href=\"https:\/\/www.capri-soft.de\/blog\/?p=4065\" class=\"more-link\"><span class=\"screen-reader-text\">Algorithmen und Datenstrukturen: Der Radix Sort in Java<\/span> weiterlesen <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2}},"categories":[475,15,3],"tags":[454,457,505,506,504,507,508,503,462],"class_list":["post-4065","post","type-post","status-publish","format-standard","hentry","category-algorithmen-und-datenstrukturen","category-java","category-programmierung","tag-algodat","tag-java","tag-least-significant","tag-lsd","tag-most-significant","tag-msd","tag-radix","tag-radix-sort","tag-sortieren"],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/p4yGeN-13z","jetpack_likes_enabled":true,"jetpack-related-posts":[],"_links":{"self":[{"href":"https:\/\/www.capri-soft.de\/blog\/index.php?rest_route=\/wp\/v2\/posts\/4065","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.capri-soft.de\/blog\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.capri-soft.de\/blog\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.capri-soft.de\/blog\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.capri-soft.de\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=4065"}],"version-history":[{"count":14,"href":"https:\/\/www.capri-soft.de\/blog\/index.php?rest_route=\/wp\/v2\/posts\/4065\/revisions"}],"predecessor-version":[{"id":4081,"href":"https:\/\/www.capri-soft.de\/blog\/index.php?rest_route=\/wp\/v2\/posts\/4065\/revisions\/4081"}],"wp:attachment":[{"href":"https:\/\/www.capri-soft.de\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=4065"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.capri-soft.de\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=4065"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.capri-soft.de\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=4065"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}