Página 1 de 1

Ayuda en algoritmo de mezcla y orden ascendente de matriz

Publicado: 20 Sep 2013, 20:41
por arkcrew
Buenas,

En primer lugar, se que ya está hecho con las funciones de array short, pero lo que tengo que hacer es una función que se le pasen dos arrays ordenados previamente de menor a mayor y que esta función los mezcle y devuelva ordenados de menor a mayor.

Se que es facil pero me estoy liando, tengo esto:

Código: Seleccionar todo

#include <Array.au3>


Local $x1[3] = [1, 2, 5]
Local $y1[5] = [0, 3, 4, 6, 15]

$array = ordenar($x1, $y1)
_ArrayDisplay($array)

Func ordenar($x, $y)
	$pos = 0;
	$pOrdenado = 0;
	Local $ordenado[UBound($x) + UBound($y)]

	For $a = 0 To UBound($x) - 1
		If ($x[$a] < $y[$pos]) Then
			$ordenado[$pOrdenado] = $x[$a]
			If (($a + 1) <= UBound($x)-1) Then
				If $y[$pos] < $x[$a + 1] Then
					$pOrdenado += 1
					$ordenado[$pOrdenado] = $y[$pos]
				Else
					$pOrdenado += 1
					$ordenado[$pOrdenado] = $x[$a+1]
					if ($y[$pos]<$x[$a + 1]) Then
						$pOrdenado += 1
						$ordenado[$pOrdenado] = $y[$pos]
					EndIf
				EndIf
			Else
				$pOrdenado += 1
				$ordenado[$pOrdenado] = $y[$pos]
			EndIf
		Else
			$ordenado[$pOrdenado] = $y[$pos]
			If ($x[$a] < $y[$pos + 1]) Then
				$pOrdenado += 1
				$ordenado[$pOrdenado] = $x[$a]
			EndIf
		EndIf
		$pos += 1
		$pOrdenado += 1
	Next

	If (UBound($x) < UBound($y)) Then
		For $a = $pos To UBound($y) - 1
			$ordenado[$pOrdenado] = $y[$a]
			$pOrdenado += 1
		Next
	EndIf

	Return $ordenado
EndFunc   ;==>ordenar
Pero me da algunos fallos y no doy con la clave.

Echadme un cable porfa!!

Saludos!

Re: Ayuda en algoritmo de mezcla y orden ascendente de matri

Publicado: 20 Sep 2013, 21:17
por arkcrew
Buenas,

Nada, era una ida de olla mía, esto es el código funcional

Código: Seleccionar todo

Func ordenarNuevo($v, $b)
	$xpos = 0
	$ypos = 0
	$total = UBound($v) + UBound($b)
	$n = UBound($v)
	$m = UBound($b)
	Local $z[$total]
	For $i = 0 To $total - 1
		If ($xpos < $n Or $ypos == $m) Then
			If $v[$xpos] <= $b[$ypos] Then
				$z[$i] = $v[$xpos];
				$xpos = $xpos + 1;
			Else
				$z[$i] = $b[$ypos];
				$ypos = $ypos + 1;
			EndIf
		Else
			If ($ypos < $m Or $xpos = $n) Then
				$z[$i] = $b[$ypos];
				$ypos = $ypos + 1;
			EndIf
		EndIf

	Next
	Return $z
EndFunc   ;==>ordenarNuevo
Saludos!