Sortieren eines Array´s

masterofeye

Mitglied
Ich habe folgendes Problem.

Die Aufgabenstellung ist: Es soll eine Funktion erstellt werden, welche Arrays mit dem Verfahren „Sortieren durch Mischen“ aufsteigend sortiert.

Funktion mittels Rekursion: sortMerge(n,a)

Dabei wird wie folgt vorgegangen:
Falls a maximal ein Element enthält ist man fertig (bereits sortiert)

Ansonsten
Bilde 2 Hälften des Arrays a und speichere sie in neue Arrays b und c
Tipp: ein neues Array mit m Elementen lässt sich wie folgt erzeugen:
double *h = new double[m];
Der Name des Arrays ist dann h;
Der Typ ist hier double; andere Typen analog;
m ist ein Ausdruck/eine Variable vom Typ int.
Mit delete []h kann man es wieder löschen.
Sortiere b und c mit SortMerge
Mische b und c (siehe Praktikum 9) und speichere das Ergebnis in a

Sooo, ich hänge jetzt an diesem Zeiger zeugs da. Irgend wie will das nicht funktionieren.
Code:
#include <iostream>
using namespace std;

void main()
{
	const int limit=100;
	int a[limit],n;
	void sortiereAuswahl(int , int []); //Sortierfunktion

	
	cout<<"\nGeben sie die Anzahl ein"<<endl;//Anzahl der Elemente im Array a
	cin>>n;
	cout<<"\nGeben sie ´das Array ein"<<endl;

	
	for(int i=0;i<n;i++)
	{
		cin>>a[i];
	}
	
	if(n==1)//Array hat nur ein Element 
	{
		cout<<"\nArray ist sortiert";
	}

	else//Falls es ander ist muss sortiert werden
	{	
                // Neue ARRAY´s erzeugen laut Aufgabenstellung
		int m=n/2;
		int l=n-m;
		int *b;
		int *c;
		 b = new int[m];  
		c = new int[l];
		
		for(int i=0;i<m;i++)
		{
			 b[i]= a[i];
		}
		for(int i=m;i<n+m;i++)
		{
			 c[i]= a[i];
		}
		
		sortiereAuswahl(m,b);
		sortiereAuswahl(n,c);
			for(int i=0;i<n;i++)
		cout<< c[i];
			delete[]c;
			delete[]b;
	}
	


}

void sortiereAuswahl(int n, int a[])
{
	int stelleMaximum(int,int[]);//Prototyp
	
	for (int anzahl=n;anzahl>1;anzahl--)
	{
		int index=stelleMaximum(anzahl,a);
		int h=a[anzahl-1];//tauschen an letzte Stelle
		a[anzahl-1]=a[index];
		a[index]=h;
		//fuer Test: ausgabe(n,a);
	}
}
int stelleMaximum(int n, int a[])
{
	if ( n<=0 )
	{return -1;}
	else
	{
		int index=0;
		for (int i=1;i<n;i++)
		if ( a[i]>a[index] )
		index=i;
		return index;
	}
}
 
Dein Programm hat mehrere Fehler.
  • Deine zweite Kopierschleife im Hauptprogramm hat eine falsche Obergrenze; auch die Indizes für c und a müssen verschieden berechnet werden. Ich würde es so schreiben, wie unten gezeigt.
  • Deine Ausgabeschleife läuft nur über c, nicht aber auch über b; außerdem hat auch sie eine falsche Obergrenze (n statt l).
  • Deine Funktion sortiereAuswahl ist kein MergeSort, sondern ein SelectionSort.

C:
int i, j;
for(i = 0; i<m; i++)
{ b[i]= a[i]; }
for(j = 0; j<l; i++,j++)
{ c[j]= a[i]; }

PS: In der Wikipedia findest du einen guten Überblick über die verschiedenen Sortieralgorithmen.
 
Zurück