ich bin ganz neu hier, ich möchte nach längerer Abstinenz wieder meine C++ Kenntnisse ausbauen. Auf meinem Rechner programmiere ich mit Code::Blocks 10.05 mit Gnu GCC und Visual Studio 2008.
Auf einer Seite habe ich hier den Sortieralgorithmus Bubblesort entdeckt und bisschen rumexperimentiert. Dabei gibt es bei den Ausgaben nach dem Sortieren an einer Stelle einen Unterschied den ich mir einfach nicht erklären kann. Verursacht wird er durch die Funktion BubbleSort_normal(matrix,size); Aber hier erst einmal der Code.
Code: Alles auswählen
#include <iostream>
#include <time.h>
using namespace std;
// Prototypen
void BubbleSort_normal (int *values, int n);
void BubbleSort_verbessert(int *values, int n);
void BubbleSort_sehrgut(int *values, int n);
void array_ausgabe(int *values, int n);
void BubbleSort_normal(int *values, int n)
{
  int tmp;        // Hilfsvariable zum Vertauschen von Werten
  // durch das ganze Feld gehen
  for (int i = 0; i < n; i++)
  {
    // am Ende beginnen das kleinste Element zu suchen
    for (int j = n - 1; j >= i; j--)
    {
      // prüfen ob das Element kleiner als der Vorgänger ist
      if (values[j] < values[j - 1])
      {
        // Werte vertauschen
        tmp = values[j];
        values[j] = values[j - 1];
        values[j - 1] = tmp;
      }
    }
  }
}
void BubbleSort_verbessert(int *values, int n)
{
  int limit;         // limit: gibt den Index des ersten unsortierten Elements an
  int lastmove;       // lastmove: Index der letzten Vertauschung
  // beim ersten Durchlauf ist das Limit 1,
  // d.h. alle Elemente werden geprüft
  limit = 1;
  do
  {
    // es wurde noch nichts vertauscht
    lastmove = 0;
    // am Ende beginnend durch den unsortierten
    // Teil des Feldes gehen
    for (int i = n - 1; i >= limit; i--)
    {
      // Wert ist kleiner als der vorhergehende
      if (values[i] < values[i - 1])
      {
        // vertauschen
        int help = values[i];
        values[i] = values[i - 1];
        values[i - 1] = help;
        // Position der Änderung merken
        lastmove = i;
      }
    }
    // alle Elemente vor dem letzten Tausch sind bereits sortiert
    // deshalb können wir beim nächsten mal dort stoppen
    limit = lastmove + 1;
  // solange sortieren, bis nichts mehr geändert wird
  } while (lastmove != 0);
}
void BubbleSort_sehrgut(int *values, int n)
{
  int left,           // left: linker Ausgangspunkt, Startpunkt bei der Suche nach dem größten Element
                      //       Endpunkt bei der Suche nach dem kleinsten Element
      right,          // right: rechter Ausgangspunkt, Startpunkt bei der Suche nach dem kleinsten Element
                      //        Endpunkt bei der Suche nach dem größten Element
      lastmove;       // lastmove: speichert den Index der letzten Vertauschung
  // Anfang des Arrays
  left = 0;
  // Ende des Arrays
  right = n - 1;
  // die letzte Vertauschung auf die Anzahl setzen; wird nichts vertauscht wird sowohl left als auch right
  // lastmove und der Algorithmus bricht ab
  lastmove = n;
  int *vec = new int[n];
  int help;
  do
  {
    // von rechts nach links das kleinste Element suchen
    // und ganz nach links verschieben
    for (int i = right; i > left; i--)
    {
      // prüfen ob das Element kleiner als das vorhergehende ist
      if (vec[i] < vec[i - 1])
      {
        // vertauschen
        help = vec[i];
        vec[i] = vec[i - 1];
        vec[i - 1] = help;
        // Index der Vertauschung merken
        lastmove = i;
      }
    }
    // bis zur Vertauschung sind alle Elemente sortiert
    left = lastmove;
    // von links nach rechts das größte Element suchen
    // und ganz nach links verschieben
    for (int i = left; i < right; i++)
    {
      // prüfen ob das Element größer als das nachfolgende ist
      if (vec[i] > vec[i + 1])
      {
        // vertauschen
        help = vec[i];
        vec[i] = vec[i + 1];
        vec[i + 1] = help;
        // Index der Vertauschung merken
        lastmove = i;
      }
    }
    // nach der Vertauschung sind alle Elemente sortiert
    right = lastmove;
  // sortieren bis sich die sortierten Bereiche überschneiden oder nichts verändert wurde
  } while (left < right);
  // !!Heap Speicher wieder freigeben!!
  delete [] vec;
}
void array_ausgabe(int *values, int n)
{
	for (int i = 0; i < n; ++i)
	{
		cout << "i: " << i << " "<< values[i] << " " << endl;
	}
	cout << endl << endl;
}
int main()
{
    int matrix[] = { 23, 11, 28, 67, 3, 9, 71, 32, 3999 , 15 , 54, 982, 10333 };
	// die Anzahl der Elemente berechnen
    int size = sizeof(matrix) / sizeof(int);
	cout << endl << endl << size << " Elemente in matrix" << endl << endl;
	cout << "matrix vor der Sortierung: " << endl;
	array_ausgabe(matrix, size);
	BubbleSort_normal(matrix,size);
	//BubbleSort_verbessert(matrix, size);
	// BubbleSort_sehrgut(matrix, size);
	cout << "matrix nach der Sortierung: " << endl;
	array_ausgabe(matrix, size);
	return 0;
}
Mit Code::Blocks gnu Compiler
matrix vor der Sortierung
i: 0 23
i: 1 11
i: 2 28
i: 3 67
i: 4 3
i: 5 9
i: 6 71
i: 7 32
i: 8 3999
i: 9 15
i: 10 54
i: 11 982
i: 12 10333
matrix nach der Sortierung
i: 0 9
i: 1 11
i: 2 15
i: 3 23
i: 4 28
i: 5 32
i: 6 54
i: 7 67
i: 8 71
i: 9 982
i: 10 3999
i: 11 10333
i: 12 4634440
Mit Visual Studio
matrix vor der Sortierung:
i: 0 23
i: 1 11
i: 2 28
i: 3 67
i: 4 3
i: 5 9
i: 6 71
i: 7 32
i: 8 3999
i: 9 15
i: 10 54
i: 11 982
i: 12 10333
matrix nach der Sortierung:
i: 0 3
i: 1 9
i: 2 11
i: 3 15
i: 4 23
i: 5 28
i: 6 32
i: 7 54
i: 8 67
i: 9 71
i: 10 982
i: 11 3999
i: 12 10333
Also der Gnu Compiler unterschlägt jeweils das kleinste Element und fügt statt dessen als letztes int Element einen undefinierten Wert ein.
Hat jemand eine Idee was hier für ein Fehler vorliegen könnte?
Viele Grüße aus Cottbus


 
  
 
  