Page 1 sur 1

Quicksort personnalisé

Posté : 16 oct. 2007, 13:07
par Flashball
Bonjour,

J'aimerais exécuter un code dans une boucle en fonction d'éléments contenus ou non dans un tableau.

Il s'agit en fait de l'algo "quicksort" que j'essaie de personnaliser pour qu'il puisse trier ce que je veux: je lui donne un tableau à trier, ainsi qu'un paramètre contenant l'ensemble des fonctions à appeller sur les éléments de ce tableau (des objets donc) pour arriver à la valeur à trier. Par exemple, je passe un tableau de voiture en argument, et un tableau contenant (getDriver, getName) et je veux que le trie s'effectue sur le nom du conducteur grâce à un appel dynamique sur Car::getDriver()->getName().

Je n'arrive pas à coder l'appel dynamique suivant la taille du tableau. Je peux coder l'appel si je connais la profondeur de l'appel (par exemple, deux fonctions, comme dans l'exemple), mais je n'arrive pas à coder le côté "taille variable" de cet appel.

De façon à contourner mon pb, j'ai - provisoirement j'espère - codé un "if else" qui me permet de faire un trie jusqu'à une profondeur de 2 appels. Ca marche, mais ce n'est pas très satisfaisant...

Pb pas évident à expliquer, voilà le code:
		
		$pivot = $tabToSort[$left];
		$i = $left - 1;
		$j = $right + 1;
		$temp;
       	
		$sizeToSort = count($functionsToSort);
		
		while(1) {
			do {
				$j--;
				
				if ($sizeToSort == 0) {
					$cond1 = strcmp($tabToSort[$j], $pivot) > 0;
				} else if ($sizeToSort == 1) {
					$cond1 = strcmp($tabToSort[$j]->$functionsToSort[0](), $pivot->$functionsToSort[0]()) > 0;
				} else {
					$cond1 = strcmp($tabToSort[$j]->$functionsToSort[0]()->$functionsToSort[1](), $pivot->$functionsToSort[0]()->$functionsToSort[1]()) > 0;
				}
			} while($cond1);
                
			do {
				$i++;

				if ($sizeToSort == 0) {
					$cond2 = strcmp($tabToSort[$i], $pivot) < 0;
				} else if ($sizeToSort == 1) {
					$cond2 = strcmp($tabToSort[$i]->$functionsToSort[0](), $pivot->$functionsToSort[0]()) < 0;
				} else {
					$cond2 = strcmp($tabToSort[$i]->$functionsToSort[0]()->$functionsToSort[1](), $pivot->$functionsToSort[0]()->$functionsToSort[1]()) < 0;
				}
			} while($cond2);
                
			if($i < $j) {
				$temp = $tabToSort[$i];
				$tabToSort[$i] = $tabToSort[$j];
				$tabToSort[$j] = $temp;
			} else return $j;
        }
		        	        	
Merci pour votre aide, et n'hésitez pas à me demander des éclaircissements sur les explications! :lol:

Posté : 16 oct. 2007, 13:26
par Tracker
Salut,

Pourquoi tu ne remplaces pas le block:
<?php
do {
	$j--;

	if ($sizeToSort == 0) {
    	$cond1 = strcmp($tabToSort[$j], $pivot) > 0;
	} else if ($sizeToSort == 1) {
    	$cond1 = strcmp($tabToSort[$j]->$functionsToSort[0](), $pivot->$functionsToSort[0]()) > 0;
	} else {
    	$cond1 = strcmp($tabToSort[$j]->$functionsToSort[0]()->$functionsToSort[1](), $pivot->$functionsToSort[0]()->$functionsToSort[1]()) > 0;
	}
} while($cond1); 

do {
	$i++;
	if ($sizeToSort == 0) {
    	$cond2 = strcmp($tabToSort[$i], $pivot) < 0;
	} else if ($sizeToSort == 1) {
		$cond2 = strcmp($tabToSort[$i]->$functionsToSort[0](), $pivot->$functionsToSort[0]()) < 0;
	} else {
    	$cond2 = strcmp($tabToSort[$i]->$functionsToSort[0]()->$functionsToSort[1](), $pivot->$functionsToSort[0]()->$functionsToSort[1]()) < 0;
	}
} while($cond2);
?>
par
<?php
do {
	$j--;
	$a = $tabToSort[$j]; $b = $pivot;
	for($k=0;$k<$sizeToSort;++$k)
	{
		$a=$a->$functionsToSort[$k];
		$b=$b->$functionsToSort[$k];
	}
	$cond1 = strcmp($a, $b) > 0;
} while($cond1); 

do {
	$i++;
	$a = $tabToSort[$i]; $b = $pivot;
	for($k=0;$k<$sizeToSort;++$k) 
	{ 
		$a=$a->$functionsToSort[$k];
		$b=$b->$functionsToSort[$k];
	}
	$cond2 = strcmp($a, $b) < 0;	
} while($cond2);
?>
?

Tracker.

Posté : 16 oct. 2007, 14:23
par Flashball
Merci, c'est nickel.

(pour répondre à ta question: parce que je suis fatigué! :roll: )