var's nach größe ordnen

Posted By: Karotte

var's nach größe ordnen - 05/18/08 07:32

Hallo,

gibts es eine einfache funktion, var's nach größe zu ordnen?

Code:
Code:
name_1 = int(random(50));
name_2 = int(random(50));
name_3 = int(random(50));
name_4 = int(random(50));
name_5 = int(random(50));


Und da soll jetzt, wenn z.B. name_2 am größten ist, soll
Code:
name_2 = 1;

sein und nach der größe jede variable einen wert haben (1,2,3,4 und 5)
Posted By: Xarthor

Re: var's nach größe ordnen - 05/18/08 08:23

die variable mit dem größten wert aus der int(random(50)); anweisung soll also den neuen wert 1 zugewiesen bekommen, die darauffolgende dann 2 etc. (wie eine rangliste) ?
Posted By: Karotte

Re: var's nach größe ordnen - 05/18/08 09:17

ja
Posted By: HeelX

Re: var's nach größe ordnen - 05/18/08 09:52

Ich gebe dir jetzt nur Hinweise, damit du dir die Lösung selbst erarbeiten kannst:


  • Für eine listenförmige Darstellung bzw. organisierte Form von Variablen bieten sich arrays hervoragend an.
  • Wenn du einer Liste mit einem Primärschlüssel wie z.B. Usernummern oder so sekundäre (zusätzliche) Daten hinzufügen willst, wie in diesem Fall ein "Punktestand", dann bietet sich ein 2-dimensionales array an, wobei du jede Zeile für einen Eintrag steht und die Spalten für die einzelenen Werte pro Eintrag. Der erste könnte deine Usernummer sein, und der zweite die "Punkte"
  • Es gibt diverse Lösungen, wie man Listen sortiert. Suche nach Sortieralgorithmen. Der einfachste zu verstehene sollte Bubblesort sein. Wichtig bei der Sortierung von 2D Arrays ist das Tauschen von ganzen Zeilen.
  • Wenn du das Array sortiert hast, kannst du anhand der Zeilennummer und der Usernummer die Position ablesen.


Arbeite das in dieser Reihenfolge ab und du wirst, denke ich mal, erfolgreich sein. Viel Erfolg!
Posted By: Karotte

Re: var's nach größe ordnen - 05/18/08 10:10

und wie erstellt man ein 2d - array?

erstellt man des so?

var array[5][2];
Posted By: Xarthor

Re: var's nach größe ordnen - 05/18/08 12:27

Wenn du Lite-C benutzt: jein var array[5][5] wäre richtig, afaik.
In C-Script gibts 2d-arrays nicht, man kann sie aber simulieren indem man ein array mit doppelter größe verwendet.
Bei 5 werten z.b.
var array[10]

Dann könntest du die plätze 0 <= i < 5 für die eig. werte nehmen und die
plätze 5 <= k < 10 für den jeweiligen sekundär wert.

Falls du c-script benutzt (dateiendung ist .wdl!) könntest du dein script auch auf ein array umstellen (1d array) und den bubble sort algorithmus verwenden den ich grad aus langerweile raus geschrieben habe.
Er funktioniert mit meinen test werten, kann aber u.U. noch verschönert werden.
Jedoch stimme ich HeelX zu, dass du soetwas mit ein bisschen nachforschen auch selber lösen könntest.

Dein script hätte dann die form:
Code:
function bubble_sort(&_array); // bubble sort prototype

var name[5];

function name_assignValues()
{
  name[0] = int(random(50));
  name[1] = int(random(50));
  name[2] = int(random(50));
  name[3] = int(random(50));
  name[4] = int(random(50));

  bubble_sort(name);
}


// Bubble sort function:
function bubble_sort(&_array)
{
	var i;
	var k;
	var buffer;
	
	i = 0;
	k = 0;
	buffer = 0;
	
	while(k < 5)
	{
		if(_array[i] > _array[i+1])
		{
			buffer = _array[i];
			_array[i] = _array[i+1];
			_array[i+1] = buffer;
		}
		else
		{
			k += 1;
		}
	
                i = cycle(i + 1, 0, 3);
		
		if(i == 0 && k < 4)
		{
			k = 0;
		}
	}
	
	//error("Bubble Sort fertig");
}


edit: Dieser bubble sort algorithmus funktioniert allerdings nur mit arrays die 5 elemente haben.

edit #2:
Habe den algorithmus bzw. die funktion überarbeitet, man übergibt nun den array und die anzahl der darin befindlichen elemente:
Code:
function bubble_sort(&_array, _nroFields)
{
	var i = 0; // element index
	var k = 0; // sort counter
	var buffer = 0; // buffer var for sorting
	
	while(k < _nroFields)
	{	
		// is the value of a lower element higher than the value of a higher element?
		if(_array[i] > _array[i+1])
		{
			buffer = _array[i]; // safe higher value in buffer
			_array[i] = _array[i+1]; // copy lower value in lower element
			_array[i+1] = buffer; // copy buffer into higher element
		}
		else // order of elements is correct
		{
			// add one to sort counter
			k += 1;
		}
		
		i += 1;
		if(i > (_nroFields-2)) { i = 0; }
		
		// new sort cycle and sorting not finished?
		if(i == 0 && k < (_nroFields-1))
		{
			// reset sort counter
			k = 0;
		}
	}
}

Posted By: Joey

Re: var's nach größe ordnen - 05/18/08 15:39

Originally Posted By: Xarthor
Wenn du Lite-C benutzt: jein var array[5][5] wäre richtig, afaik.


ne, es is array[5][2] oder noch eher array[2][5].
Posted By: Xarthor

Re: var's nach größe ordnen - 05/18/08 15:49

Oh ja, da hast du natürlich Recht Joey. [5][5] wäre ein 5x5 feld, also mit 25 feldern insgesamt... sorry.
Posted By: Dark_samurai

Re: var's nach größe ordnen - 05/18/08 20:17

Quote:
Der einfachste zu verstehene sollte Bubblesort sein.


Das sagen zwar immer alle, aber ich bin da total anderer Meinung. Der meiner Meinung nach einfachste ist dieser (keine Ahnung ob der nen Namen hat, den habe ich mir selbst mal ausgedacht):
-Größte Zahl aus Array auslesen
-in 2. Array an 1. Stelle speichern
-Die Zahl aus dem 1. Array rauslöschen
-von vorne nur diesmal Zahl im 2. Array an 2. Stelle speichern
-usw.

Das mit dem Bubblesort ist zwar vom Ablauf her leichter (immer 2 Zahlen vertauschen) aber das das überhaupt zu einer richtigen Sortierung führt ist meiner Meinung nach schon nicht mehr so einfach zu verstehen.
Aber wie immer ist das nur meine Meinung wink

Dark_Samurai
Posted By: Joey

Re: var's nach größe ordnen - 05/18/08 21:53

deins ist eindeutig leichter zu verstehen wie bubblesort, aber ziemlich langsam.
Posted By: Dark_samurai

Re: var's nach größe ordnen - 05/19/08 11:46

Wenn es um Geschwindigkeit geht wird auch kein Mensch Bubblesort verwenden, da es viel bessere gibt. Aber ich wollte nur zeigen das es nicht der am einfachsten zu verstehende ist.

PS: Eigentlich sollte er genau so schnell sein wie Bubblesort. Man muss nur statt dem rauslöschen das ganze Array um 1 Zahl verkürzen, dann hat man die selbe Anzahl an Durchläufen. Mit dem einzigen Nachteil, dasd man unnötig Speicher verbraucht (wegen dem 2. Array).

Dark_Samurai
Posted By: HeelX

Re: var's nach größe ordnen - 05/19/08 13:39

Hey, Bubblesort ist cool ^^ für kleine Felder kann man den ruhig anwenden. Objektiv betrachtet, sollte man vermeiden, nicht in-place zu sortieren. Das ist mir lieber als ne etwas langsamerer Laufzeit.
Posted By: FBL

Re: var's nach größe ordnen - 05/20/08 22:42

also ich glaub bei 50 Elementen ist es sowas von egal ob man da einen tree sort, bubble sort oder was auch immer macht. Das geht so schnell...
Da frißt ein Entity, das man ins Level stellt, vermutlich mehr Performance.
Salopp gesagt: drauf gschissn.

Bei größeren Datenmengen wie z.B. Meshes und Octree sollte man sich Gedanken über eine effiziente Sortierung machen.
Posted By: HeelX

Re: var's nach größe ordnen - 05/20/08 22:56

Mein persönlicher Favorit ist ja Random-Sort XD
© 2023 lite-C Forums