Wo ist der Fehler?



  • und
    

    die deinen Code übersichtlicher darstellen.

    bnz



  • Hey,

    du solltest schon etwas präzieser werden, denn der Code wird anstandslos kompiliert und auf den ersten Blick ist mir auch nichts aufgefallen 😛



  • ja, wegen dem kompilieren sag ich ja nix

    aber wenn du zB länge der liste 5 eingibst und dann 5 liestenelemente werden die nicht richtig gemischt/sortiert und es kommen irgendwelche kryptischen zahlen raus



  • also mit deiner version bin ich nicht klar gekommen, hab mir auch ein bischen was zusammen gebaut und etwas bei der version von nwp2 gespickt http://www.c-plusplus.net/forum/viewtopic-var-t-is-258328-and-start-is-0.html 😉

    #include<iostream>
    #include<stdio.h>
    #include<stdlib.h>
    using namespace std;
    
    void merge(float *left,int llen,float *right,int rlen,float *buffer) {
    	int l = llen+rlen;
    	float *leftCache = left;
    	float *bufferCache = buffer;
    
    	while(llen&&rlen){
    		if(*left<=*right){
    			*buffer++ = *left++;
    			llen--;
    		}else{
    			*buffer++ = *right++;
    			rlen--;
    		}
    	}
    	while(llen--){
    		*buffer++ = *left++;
    	}
    	while(rlen--){
    		*buffer++ = *right++;
    	}
    	while(l--){
    		*leftCache++ = *bufferCache++;
    	}
    }
    
    void mergesort(float *liste,int size,float *buffer)
    {
    	int right = size&0x1;
    	int left = size>>1;
    	right+=left;
    
    	if(left>1)
    		mergesort(liste,left,buffer);
    	if(right>1)
    		mergesort(liste+left,right,buffer);
    	merge(liste,left,liste+left,right,buffer);
    }
    
    int main(void){
    	float *array;
    	float *buffer;
    	int size;
    	int i=0;
    
    	cout<<"Geben Sie die Laenge Ihrer Liste ein: ";cin>>size;
    	array = new float[size+1];
    	buffer = new float[size+1];
    
    	cout<<"Geben Sie eine Liste ein: ";
    	for(i=0;i<size;i++)
    		cin>>array[i];
    
    	mergesort(array,size,buffer);
    
    	cout<<endl<<size<<endl;
    	for(i=0;i<size;i++)
    		cout<<array[i]<<" ";
    
    	delete array;
    	delete buffer;
    
    	return 0;
    }
    

    btw. hat die STL nicht eh sowas dabei 😕
    http://www.sgi.com/tech/stl/stable_sort.html

    lg lolo



  • dankefein,

    muss mal schauen, wie ich das auf meines anwenden kann 🙂



  • also wenn du das in irgend einer form verwenden willst was du natürlich gerne machen kannst 🤡 mußt das noch ausgiebig testen hatte vorhin mal nen fehler das er das letzte element nicht mit ausgegeben hat? habs dann nochmal probiert, und er war weg? kpl. ob der da noch rum geistert 😕



  • int right = size&0x1;
    int left = size>>1;

    was bedeutet das?



  • 😃

    wenn zahl ungerade right = 1
    sonst right = 0
    left = floor(zahl/2)
    right = right + zahl
    


  • ach verdammt die letzte zeile muß natürlich

    right = right + floor(zahl/2)
    

    heißen 😉



  • noobLolo schrieb:

    also mit deiner version bin ich nicht klar gekommen, hab mir auch ein bischen was zusammen gebaut und etwas bei der version von nwp2 gespickt http://www.c-plusplus.net/forum/viewtopic-var-t-is-258328-and-start-is-0.html 😉
    [cpp]
    #include<iostream>
    #include<stdio.h>
    #include<stdlib.h>
    using namespace std;

    void merge(float *left,int llen,float *right,int rlen,float *buffer)<---hier bin ich völlig überfragt(wo is denn die liste hin? und warum is jetz left die liste??? {
    int l = llen+rlen;
    float *leftCache = left;
    float *bufferCache = buffer;

    while(llen&&rlen){
    if(*left<=*right){
    *buffer++ = *left++;
    llen--;
    }else{
    *buffer++ = *right++;
    rlen--;
    }
    }
    while(llen--)<---was is denn die bedingung???was sagtst du damit aus???{
    *buffer++ = *left++;
    }
    while(rlen--){
    *buffer++ = *right++;
    }
    while(l--){
    *leftCache++ = *bufferCache++;
    }
    }

    void mergesort(float *liste,int size,float *buffer)
    {
    int right = size&0x1; <---ok was machst du da???
    int left = size>>1; <----und da auch???
    right+=left;

    if(left>1)
    mergesort(liste,left,buffer);
    if(right>1)
    mergesort(liste+left<---addierst du hier array mit ner int zahl???,right,buffer);
    merge(liste,left,liste+left**<---was das?**,right,buffer);
    }

    int main(void){
    float *array;
    float *buffer;
    int size;
    int i=0;

    cout<<"Geben Sie die Laenge Ihrer Liste ein: ";cin>>size;
    array = new float[size+1];
    buffer = new float[size+1];

    cout<<"Geben Sie eine Liste ein: ";
    for(i=0;i<size;i++)
    cin>>array[i];

    mergesort(array,size,buffer);

    cout<<endl<<size<<endl;
    for(i=0;i<size;i++)
    cout<<array[i]<<" ";

    delete array;
    delete buffer;

    return 0;
    }
    [/cpp]

    btw. hat die STL nicht eh sowas dabei 😕
    http://www.sgi.com/tech/stl/stable_sort.html

    lg lolo

    erst ma cooles prog... siehe quote



  • ich glaub du kommst mal besser bei uns im ansi c forum vorbei 😉



  • axo ja scheinbar verwendet auch c++ für arrays zeiger so wie c und da kann man super mit zeigern arbeiten afaik is ja nur das "new" und "delete" und die includes c++ der rest ist ansi c 😉

    mit ansi c forum meinte ich natürlich
    http://www.c-plusplus.net/forum/viewforum-var-f-is-10.html



  • wenn in einer schleife sei es while oder for kein vergleich steht ist wird das automatisch ergänzt und zwar so:

    aus
    while(x)
    wird
    while(x!=0)
    

    bullet proof wäre

    while(x-->0)
    

    aber man muß es ja nicht übertreiben...

    der rest sollte eigentlich schon verständlich sein, falls nicht schau dir mal zeigerarithmetik an oder wie das heißt 😉


Anmelden zum Antworten