Quicksort



  • Bekomm einen stackoverflow und weiß nicht warum

    #include <iostream>
    
    int teile(int links,int rechts,int* x)
    {
    
    	int store=rechts;
    	int pivot=x[rechts];
    
    	while(rechts>links)
    	{
    
          while(x[links]<pivot)
    	  {
    
    	    if(links>=rechts) break;
            links++;
    
    	  }
    
    	  while(x[rechts]>pivot)
    	  {
            if(links>=rechts) break;
                rechts--;
    
    	  }
    
         int tmp=x[links];
         x[links]=x[rechts];
         x[rechts]=tmp;
    
        }
    
    	int tmp=x[links];
    	x[links]=pivot; 
    	x[store]=tmp;
    
    	return links;
    
    }
    
    void quicksort(int links,int rechts,int* x)
    {
    
    int pivot_index=teile(links,rechts,x);
    
    quicksort(0,pivot_index,x);
    quicksort(pivot_index+1,rechts,x);
    
    }
    
    void main(void)
    {
    
    	int x[]={8,4,13,11,5,19,12};
    
    	quicksort(0,(sizeof(x)/sizeof(x[0]))-1,x);
    
    	for(int i=0;i<sizeof(x)/sizeof(int);i++)
    	{
    
    		std::cout<<x[i];
    	}
    
    }
    


  • Du hast keine Randbedingung bei der Rekursion, quicksort ruft sich unendlich oft auf.



  • Danke. Hab ich jetzt ergänzt. Trotzdem stimmt etwas noch nicht .

    #include <iostream>
    
    int teile(int links,int rechts,int* x)
    {
    
    	int store=rechts;
    	int pivot=x[rechts];
    
    	while(rechts>links)
    	{
    
          while(x[links]<pivot)
    	  {
    
    	    if(links>=rechts) break;
            links++;
    
    	  }
    
    	  while(x[rechts]>pivot)
    	  {
            if(links>=rechts) break;
                rechts--;
    
    	  }
    
         int tmp=x[links];
         x[links]=x[rechts];
         x[rechts]=tmp;
    
        }
    
    	int tmp=x[links];
    	x[links]=pivot; 
    	x[store]=tmp;
    
    	return links;
    
    }
    
    void quicksort(int links,int rechts,int* x)
    {
    
    if(links<rechts)
    {
    int pivot_index=teile(links,rechts,x);
    quicksort(0,pivot_index,x);
    quicksort(pivot_index+1,rechts,x);
    }
    }
    
    void main(void)
    {
    
    	int x[]={8,4,13,11,5,19,12};
    
    	quicksort(0,(sizeof(x)/sizeof(x[0]))-1,x);
    
    	for(int i=0;i<sizeof(x)/sizeof(int);i++)
    	{
    
    		std::cout<<x[i];
    	}
    
    }
    


  • Es gibt soviele Implementierungen für den Quicksort.
    Versteh nicht warum manche es kompliziert machen, wenn es auch einfacher geht.
    Hab jetzt einen ganz neuen Ansatz gefunden.

    Grüße !



  • Cox schrieb:

    Du hast keine Randbedingung bei der Rekursion

    Mathematiker? 🙂

    blurry333 schrieb:

    Versteh nicht warum manche es kompliziert machen, wenn es auch einfacher geht.

    Wenn es dir nicht ums Selbst-Implementieren, sondern ums Sortieren geht, kannst du auch std::sort() aus der Standardbibliothek verwenden. Das wäre dann wohl das Einfachste. 😉



  • Nexus schrieb:

    Mathematiker? 🙂

    Gott bewahre! 😃 Ich hab mir das nur so angewöhnt 😉



  • Cox schrieb:

    Gott bewahre! 😃 Ich hab mir das nur so angewöhnt 😉

    Okay. Ich habe mich nur etwas gewundert, da ich im Zusammenhang mit Rekursion eher von Abbruchbedingung spreche. Randbedingung hat mich an Differentialgleichungen erinnert... 😉


Anmelden zum Antworten