• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

[C++] Bubblesort

Status
Für weitere Antworten geschlossen.

N10B

Neues Mitglied
Tagchen,

ich hab gestern einene Sortieralgorithmus geschrieben.
Bubblesort ( ich weiss - nicht sehr effizient...aber einfach)
Das problem ist, er macht nicht wirklich das was er soll. Semantisch und Logisch ist er eigentlich korrekt.

Code:
#include <iostream>

using namespace std;

int main(){
	
	int sorted[9], count=0, i=0, temp, line=1;
	
	cout << " zahlen eingeben (max. 10)"<< flush << endl;
	
// Einlesen der Zahlen

	do{
		cout << line << ": ";
		cin >> sorted[count];
		cout << endl;
		count++;
		line++;
	}
	while(count < 10);
	
	system("pause");
	
// Sortieren
	
	do{
		if(sorted[i] > sorted[i+1]){
			temp = sorted[i+1];
			sorted[i] = sorted[i+1];
			sorted[i+1] = temp;
			i++;
		}
		
		
	}
	while(sorted[i]>sorted[i+1]);
	
// Ausgeben des Sortierten Arrays

	for(i=0;i<12;i++){
		cout << sorted[i] << endl;
	}
	system("pause");
	exit(0);
}

lg,
n1ob
 
Werbung:
Hier sortierst du ja:
Code:
do{
  if(sorted[i] > sorted[i+1]){
    temp = sorted[i+1];
    sorted[i] = sorted[i+1];
    sorted[i+1] = temp;
    i++;
  }
}
while(sorted[i]>sorted[i+1]);

Was ich allerdings nicht verstehe ist warum du i immer weiterzählst. i überschreitet doch irgendwann die array grenzen und dann gibt es nette fehler. Ist hier eine normale zählschleife nicht angebrachter?

Code:
for(int i = 0; i < 9; i++) /* Er zählt nur bis 8 weil mit i + 1 automatisch stelle 9 erreicht wird und sonst die array grenze übertreten wird. */
{
  if(sorted[i] > sorted[i + 1])
  {
    int temp = sorted[i + 1];
    sorted[i + 1] = sorted[i];
    sorted[i] = temp;
  }
}

Damit sollte es gehen allerdings hast du hier noch das problem das du nur eine zahl an die richtige stelle schiebst. Das heißt du musst diesen vorgang mehrmals durchführen. Wenn du davon ausgehst das jede zahl falsch liegt genau so oft wie du zahlen hast. Das heißt du brauchst noch eine äußere schleife die alles wiederholt.
ZUr optimierung kannst du nach jedem durchlauf der inneren schleife den interval um 1 verkürzen da nach jedem durchlauf eine zahl bereits an der richtigen stelle steht. Das sieht dann so aus:
Code:
for(int j = 9; j >= 0; j--)
{
  for(int i = 0; i < j; i++)
  {
    if(sorted[i] > sorted[i + 1])
    {
      int temp = sorted[i + 1];
      sorted[i + 1] = sorted[i];
      sorted[i] = temp;
    }
  }
}

Ansonsten lies dir doch mal denn artikel auf wikipedia durch. Der erklärt das ganze recht gut.

Mein code ist sehr auf deinen bezogen es lässt sich wahrscheinlich noch allgemeiner fassen. Ausserdem ist er quick und dirty also nicht mitsicherheit richtig...
 
Werbung:
hi,
das wesentliche hat schon Prophet gesagt, und mehr kann ich net erkennen.
Sorry :sad:
Was ich allerdings nicht verstehe ist warum du i immer weiterzählst. i überschreitet doch irgendwann die array grenzen und dann gibt es nette fehler. Ist hier eine normale zählschleife nicht angebrachter?
eben, und diese netten Fehler werden nicht angezeigt, da der Compiler und das Programm sowas nicht absehen können. Wenn du auf Indexen(? Plural von Index:roll:), die nicht mehr im Speicher sind, zugreifst, wird es leider ne Menge
geben, und das Programm wird nicht mehr richtig arbeiten.

greez web_spider :D
Und sorry nochmal :(
 
Status
Für weitere Antworten geschlossen.
Zurück
Oben