Quick-Sort

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Hallo,
    Agnahim fragte mich neulich nach einem guten sortieralgorythmus. da ich über sortieralgorythmen erst vor wenigen wochen eine klausur geschrieben habe und mich auf dem gebiet nun ein bischen auskenne, habe ich mich für den quicksort entschieden. ich kenne ihn aus java, und dachte das es ziemlich einfach währe ihn zu "konvertieren", dem ist aber leider nicht so.
    hier erstmal die 3 scripte die dazu gebraucht werden:

    GML-Quellcode

    1. // scr_quick
    2. a = argument0;
    3. anfang = argument1;
    4. ende = argument2;
    5. var p, k;
    6. if ( anfang >= ende ) {
    7. // mach nix mehr
    8. } else {
    9. p = a[floor((anfang+ende)/2)];
    10. k = scr_partition(a,anfang,ende,p);
    11. scr_quick(a,anfang,k);
    12. scr_quick(a,k+1,ende);
    13. }
    Alles anzeigen



    GML-Quellcode

    1. // scr_partition
    2. a = argument0;
    3. l = argument1;
    4. r = argument2;
    5. p = argument3;
    6. while( l < r ){
    7. while( a[l] < p ) {
    8. l+=1;
    9. }
    10. while( a[r] > p ) {
    11. r-=1;
    12. }
    13. if ( l < r ) {
    14. scr_tausch(l,r,a);
    15. l+=1;
    16. r-=1;
    17. }
    18. }
    19. if ( a[r] > p ) {
    20. return (r-1);
    21. } else {
    22. return (r);
    23. }
    Alles anzeigen



    GML-Quellcode

    1. // scr_tausch
    2. anfang = argument0;
    3. ende = argument1;
    4. a = argument2;
    5. var temp1, temp2;
    6. temp1 = a[anfang];
    7. temp2 = a[ende];
    8. a[anfang] = temp2;
    9. a[ende] = temp1;
    Alles anzeigen


    und das objekt mit dem ich die sache teste:

    GML-Quellcode

    1. //create:
    2. for(i=0;i<9;i+=1) {
    3. a[i] = floor(random(10));
    4. b[i] = a[i];
    5. }
    6. // temp=0;
    7. scr_quick(a[],0,8);
    8. //draw:
    9. for(i=0;i<9;i+=1) {
    10. draw_text(32,16+i*32,b[i]);
    11. draw_text(128,16+i*32,a[i]);
    12. }
    Alles anzeigen
    leider wird der array nicht korrekt sortiert, ich vermute das die arrayübergabe nicht so einfach ist wie in java.

    irgentwelche vorschläge?
    :) Nobody is perfect (-:

    "Dummköpfe sind Denkerköpfen weit überlegen. Zahlenmäßig." Ernst Ferstl
  • Also an der Übergabe von Arrays hab ich mir auch schon die Zähne ausgeschlagen. GM kann nur Strings und Zahlen als Argumente nehmen, bei Arrays wird der erste Inhalt als Wert übertragen.
    Du musst deshalb den Arraynamen als String übertragen und mit dem Funktionen für Arrays arbeiten, nur so kann man Arrays Skriptübergreifend wirklich benutzen.
    "Die Erde ist ein Irrenhaus. Dabei könnte das bis heute erreichte Wissen der Menschheit aus ihr ein Paradies machen. Dafür müsste die weltweite Gesellschaft allerdings zur Vernunft kommen."
    - Joseph Weizenbaum
  • RE: Quick-Sort

    Original von Nobody-86

    GML-Quellcode

    1. // scr_quick
    2. a = argument0;
    3. anfang = argument1;
    4. ende = argument2;
    5. var p, k;
    6. if ( anfang >= ende ) {
    7. // mach nix mehr
    8. } else {
    9. p = variable_local_array_get(a, floor((anfang+ende)/2));
    10. k = scr_partition(a,anfang,ende,p);
    11. scr_quick(a,anfang,k);
    12. scr_quick(a,k+1,ende);
    13. }
    Alles anzeigen



    GML-Quellcode

    1. // scr_partition
    2. a = argument0;
    3. l = argument1;
    4. r = argument2;
    5. p = argument3;
    6. while( l < r ){
    7. while( variable_local_array_get(a, l) < p ) {
    8. l+=1;
    9. }
    10. while( variable_local_array_get(a, r) > p ) {
    11. r-=1;
    12. }
    13. if ( l < r ) {
    14. scr_tausch(l,r,a);
    15. l+=1;
    16. r-=1;
    17. }
    18. }
    19. if ( variable_local_array_get(a, r) > p ) {
    20. return (r-1);
    21. } else {
    22. return (r);
    23. }
    Alles anzeigen



    GML-Quellcode

    1. // scr_tausch
    2. anfang = argument0;
    3. ende = argument1;
    4. a = argument2;
    5. var temp1, temp2;
    6. temp1 = variable_local_array_get(a, anfang);
    7. variable_local_array_set(a, anfang, variable_local_array_get(a, ende));
    8. variable_local_array_set(a, ende, temp1);
    Alles anzeigen


    und das objekt mit dem ich die sache teste:

    GML-Quellcode

    1. //create:
    2. for(i=0;i<9;i+=1) {
    3. a[i] = floor(random(10));
    4. b[i] = a[i];
    5. }
    6. // temp=0;
    7. scr_quick("a",0,8); //MUSS als string übergeben werden
    8. //draw:
    9. for(i=0;i<9;i+=1) {
    10. draw_text(32,16+i*32,b[i]);
    11. draw_text(128,16+i*32,a[i]);
    12. }
    Alles anzeigen
  • Ich könnte noch die Datenstruckturen empfehlen. Das macht es gegenüber arrays wesentlich leichter die Daten zu verwalten.

    GML-Quellcode

    1. ds_list_sort(...);


    Damit wird dann die Liste sortiert.
    In der Anleitung steht auch, dass Listen schneller sind als Arrays. Wenn also arrays nicht unbedingt erforderlich sind wird ich diese Datenstrucktur nehmen.

    gamemaker.nl/doc/html/411_03_lists.html
  • Ich hab die quicksort routine schon in einem meiner projekte benutzt, und habe das array problem gelöst, indem ich nicht das array übergeben habe, sonder den namen des arrays einfach angeben haben ohne es zu übergeben.
    das heisst, wenn ich im object das array a[] deklariere, arbeite ich einfach mit a[] in der quicksort routine
    hier die datei:
    yourfileupload.com/file.php?fi…02147060160f3c939bd72f135

    hoffe es hilft.
    Zitat während der Programmierarbeit: "Ach das geht schon" ;
    "Moment, das hab ich gleich" "Ich weiss wo der Fehler liegt....."
    "lol"