Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (GNU/Linux, *NIX, *BSD und Co) » Sortieralgorithmus

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ]
000
19.12.2009, 15:47 Uhr
Pamina



Hey ich hab da mal wieder ne Frage,
wir sollen diesmal ein Programm schreiben, dass n zahlen einließt und dann sortiert und zwar nicht so schön einfach wie Bubble sort sondern irgendwie doof hier mal die aufgabe:


Code:
Sei arr ein Array mit n Komponenten. Implementieren Sie den folgenden Sortieralgorithmus nach
der Vorgehensweise aus der Ubung.
1. Setzt i (den Lau ndex) auf 0
2. Jetzt durchsuche das Array arr und zahle dabei wieviele Elemente kleiner sind als arr(i).
Anschlieend tausche arr(i) mit arr(m), wobei m die Anzahl der Elemente ist die kleiner
sind als arr(i).
3. Hat i den Wert m, so erhohe i um eins
4. Hat man das ganze Array arr durchsucht, also i = n -1, so endet das Programm, sonst fahre
fort mit 2.
.

eigentlich ist es ja logisch aber irgendwie funktioniert bei mir die Ausgabe nicht.
wir haben jetzt 2 stunden rumgeknobelt aber es geht einfach nicht weiter.

hier mal das was wir haben:


C++:
#include <iostream>
using namespace std;

void swap (int*a, int*b)
{int temp=*a;
*a=*b;
*b=temp;
}
int main ()
{
    int n,m,l,x;
    cout <<"Bitte geben Sie die Arraylaenge ein!"<< endl;
    cin >>n;

    int *arr=new int [n];
    int i=0;
    
    cout <<"Bitte geben Sie Ihre "<<n<<" Zahlen ein."<< endl;
    
    for (i=0;i<n;i++)
        {
            cin>>arr[i];

        }

            cout <<int (arr[i])<< endl;

l=0;


for (i=0;i<(n-1);i++)
{
    for (m=0;m<n;m++)
    {    
        if (arr[m]<arr[i])
            {
            
            l=l+1;
            }
            
    
        else
            {i=i+1;
            }
    
        
    }
        l=m;
        swap (arr[i],arr[m]);
    
}

    cout <<"Das sortierte Array lautet: "<<arr[i]<< "" <<endl;

getchar();getchar();
    return 0;
}




Kann uns vielleicht jemand helfen??

danke im vorraus lg
Pamina
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
19.12.2009, 17:58 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


naja mit


C++:
cout <<int (arr[i])<< endl;



bzw


C++:
cout <<"Das sortierte Array lautet: "<<arr[i]<< "" <<endl;



gibst du ja immer nur ein i-te element aus.
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
19.12.2009, 22:46 Uhr
Pamina



oh ok dachte arr[i] ist mein gesammtes array

wie heißt denn mein ganzes array?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
19.12.2009, 23:38 Uhr
0xdeadbeef
Gott
(Operator)


arr.

Ausgegeben kriegst du's beispielsweise als

C++:
#include <algorithm>
#include <iterator>

// ...

std::copy(arr, arr + n, std::ostream_iterator<int>(std::cout, ", "));


...oder stumpf in einer Schleife.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
19.12.2009, 23:48 Uhr
Pamina



ähh ahja

versteh ehrlicherweise nur bahnhof *g*
wir sind ja auch noch ganz am anfang in c++ und dürfen eigentlich nur sachen verwenden die wir auch schon hatten und äm leider kenn ich die hälfte von dir nicht...
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
20.12.2009, 00:30 Uhr
0xdeadbeef
Gott
(Operator)


Der copy-Aufruf kopiert alles zwischen den ersten beiden Iteratoren in den dritten; in diesem Fall alles zwischen arr und arr + n (also das Array) in den ostream_iterator, der so eingerichtet ist, dass er die Elemente mit nachfolgendem ", " nach std::cout schreibt.

Alternativ kannst du natürlich in einer Schleife einen Index von 0 bis n - 1 laufen lassen und die Elemente von Hand ausgeben.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
20.12.2009, 12:22 Uhr
Pamina



ah ok danke ich werds mal versuchen
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
20.12.2009, 14:10 Uhr
Pamina



so,
also ich habe jetzt nochmal ein bisschen getüftelt.. das array wird jetzt schön ausgegeben mit einer schleife. aber ich habe keinen plan, wo ich am besten die "große" schleife rumsetze, damit das ganze mehrmals gemacht wird, und wie ich sie begrenze.. heißt, das programm macht schon das, was es soll, aber nur einmal

hier also nochmal das, was wir bisher haben:

C++:
#include <iostream>
using namespace std;

void swap (int*a, int*b)
{int temp=*a;
*a=*b;
*b=temp;
}
int main ()
{
    int n,m,l;
    cout <<"Bitte geben Sie die Arraylaenge ein!"<< endl;
    cin >>n;

    int *arr=new int [n];
    int i=0;
    
    cout <<"Bitte geben Sie Ihre "<<n<<" Zahlen ein."<< endl;
    
    for (i=0;i<n;i++)
        {
            cin>>arr[i];

        }
    cout<< endl;

    for (i=0;i<n;i++)
        {
            cout<<arr[i]<<endl;
        }
    cout<<endl;
    l=0;
    i=0;


    for (m=0;m<n;m++)
    {    
        if (arr[i]>arr[m])
            {
            
            l=l+1;
            }
        
    }
        
        m=l;
        swap (arr[i],arr[m]);
        
    
    


cout <<"Das sortierte Array lautet: "<<endl;
for (i=0;i<n;i++)
    {
        cout<<arr[i]<<endl;
    }
cout<<endl;

getchar();getchar();
    return 0;
}




schonmal vielen dank für die hilfe bisher
lg, Pamina
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
20.12.2009, 16:54 Uhr
0xdeadbeef
Gott
(Operator)


Ich würde das Sortieren wohl in eine Schleife auslagern, etwa

C++:
void sort(int *array, int n) {
  // Sortierung hier
}

int main() {
  bool nochmal;

  do {
    int n, int *arr;

    // Arraylänge und Array eingeben

    sort(arr, n);

    // Array ausgeben, arr freigeben
    // Nachfragen, ob nochmal sortiert werden soll
  } while(nochmal);
}


Das Freigeben ist übrigens wichtig - was mit new[] angefordert wird, muss mit delete[] wieder freigegeben werden, sonst leckst du Speicher.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra

Dieser Post wurde am 20.12.2009 um 16:54 Uhr von 0xdeadbeef editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
20.12.2009, 18:39 Uhr
Pamina



ok, aber wenn ich das so mache, kommt immer:

error C2664: 'sort': Konvertierung des Parameters 1 von 'int' in 'int *' nicht möglich


außerdem versteh ich das mit dem bool nicht so ganz. dem muss ich doch noch entweder den wert true oder false zuweisen? jedenfalls kommt da immer ne warnung, dass die nicht initialisierte lokale variable nochmal verwendet wurde.. oh man, stehe gerade echt auf dem schlauch, sorry. das array habe ich auf jeden fall ganz am schluss wieder freigegeben.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ C / C++ (GNU/Linux, *NIX, *BSD und Co) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: