none
QuickSort - ProgressBar RRS feed

  • Frage

  • Guten Tag Community,

    währen einer Sortierung soll meine ProgressBar den Fortschritt anzeigen. Dazu benötige ich einen Zahlenwert der meiner ProgressBar übergeben wird. Beim Quicksort berechnet sich die Laufzeit (im besten Fall) n*log2(n), da ich mich in der Umgebung von C++ befinde habe ich die Formel dementsprechend umgeformt. Hier mal der Code- Ausschnitt damit es verständlicher wird.

    void Sortieren::quicksort(int *ar_quick, int left, int right, int array_size, int &counter)
      {
        int i = left;
        int j = right;
        int tmp;
        int pivot = ar_quick[(left + right) / 2];
        double progressvalue;
    
        //partion
        while (i <= j)
        {
          while (ar_quick[i] < pivot)
            i++;
          while (ar_quick[j] > pivot)
            j--;
    
          if (i <= j)
          {
            counter++;
            tmp = ar_quick[i];
            ar_quick[i] = ar_quick[j];
            ar_quick[j] = tmp;
            i++;
            j--;
          }
        };
    
        progressvalue = counter*100/ (array_size (log10(array_size)/log10(2)));
    
        myFormControl1->UpdateQuickSort("",progressvalue);
    
        //recursion
        if (left<j)
          quicksort(ar_quick, left, j,array_size, counter);
        if (i<right)
          quicksort(ar_quick, i, right,array_size, counter);
      }
     

    Ich habe den Counter mit an die Funktion übergeben, damit dieser bei der Rekursion nicht wieder auf Null gesetzt bzw. einen runtergezählt wird. Ich hatte schon überlegt den Counter noch ebenfalls beim direkten Vergleich mit einzufügen aber das ist ebenfalls noch nicht Zielführend. Die ProgressBar füllt sich nur bis zu 1/3.

    MfG SnitsuD

    Donnerstag, 14. Januar 2016 09:10

Antworten

  • Das Problem liegt nicht an dem QuickSort. (Damit er richtig läuft muss der Counter noch den beiden Schleifen hinzugefügt werden. Die Formel des progressvalues und die Übergabe an den delegate kommt nach den beiden Rekursiv Aufrufen!).

    Progressbar wird ungefähr nur bis 70-80% gefüllt
    Das eigentliche Probelm, sprich die korrekte Füllung der Progressbar, liegt an dem zu großem Wert des progressvalues.
    Wenn der progressvalue z.B. den Wert 20 annimmt, dann hat die Progressbar die Aufgabe Sie bis zum 20ten Value zu füllen. Schafft Sie aber während der Zeit vom Delegate nicht. Die Animation der Progressbar von Windows kommt nicht hinterher (Vorwärtsbewegung: Smooth; Rückwärtsbewegung: Sprung). 

    this->progressBarSelection->Maximum = 101;
    this->progressBarSelection->Value = 101;
    this->progressBarSelection->Maximum = 100;
    Hat dann letztendlich Abhilfe geschaffen, nutze zum Schluss die Rückwärtsbewegung um die Füllung anzuzeigen

    Dann springt er die letzten % zwar aber um das Gesamtergebnis darzustellen reicht es auf jeden Fall aus!

    • Als Antwort markiert SnitsuD Donnerstag, 21. Januar 2016 17:08
    Freitag, 15. Januar 2016 17:39

Alle Antworten

  • Habe das Problem selber gelöst :)
    Beitrag kann also abgehakt werden, bitte.

    Wenn einer Fragen haben sollte, dann nur kurz melden!


    • Bearbeitet SnitsuD Donnerstag, 14. Januar 2016 23:16
    Donnerstag, 14. Januar 2016 23:15
  • Hallo SnitsuD,

    Würdest Du die Lösung, die Du gefunden hast, näher beschreiben, damit sie auch künftigen Lesern dieses Threads zur Verfügung steht?

    Gruß,
    Dimitar


    Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip „IT-Pros helfen IT-Pros“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.

    Freitag, 15. Januar 2016 09:09
    Moderator
  • Das Problem liegt nicht an dem QuickSort. (Damit er richtig läuft muss der Counter noch den beiden Schleifen hinzugefügt werden. Die Formel des progressvalues und die Übergabe an den delegate kommt nach den beiden Rekursiv Aufrufen!).

    Progressbar wird ungefähr nur bis 70-80% gefüllt
    Das eigentliche Probelm, sprich die korrekte Füllung der Progressbar, liegt an dem zu großem Wert des progressvalues.
    Wenn der progressvalue z.B. den Wert 20 annimmt, dann hat die Progressbar die Aufgabe Sie bis zum 20ten Value zu füllen. Schafft Sie aber während der Zeit vom Delegate nicht. Die Animation der Progressbar von Windows kommt nicht hinterher (Vorwärtsbewegung: Smooth; Rückwärtsbewegung: Sprung). 

    this->progressBarSelection->Maximum = 101;
    this->progressBarSelection->Value = 101;
    this->progressBarSelection->Maximum = 100;
    Hat dann letztendlich Abhilfe geschaffen, nutze zum Schluss die Rückwärtsbewegung um die Füllung anzuzeigen

    Dann springt er die letzten % zwar aber um das Gesamtergebnis darzustellen reicht es auf jeden Fall aus!

    • Als Antwort markiert SnitsuD Donnerstag, 21. Januar 2016 17:08
    Freitag, 15. Januar 2016 17:39