¡Esta es una revisión vieja del documento!
int BinarySearch (int dato,int length){ int inicio,final,medio; inicio = 0; final = length-1; while (inicio <= final) { medio = (inicio+final)/2; if (dato == array[medio]) return medio; else { if(dato > array[medio]) inicio = medio+1; else final = medio-1; } } return -1; }
public static void sort(double[ ] nums) { for(int i = 0; i < nums.length; i++) { // Nos quedamos con el mínimo, el actual. int min = i; // Buscamos el más pequeño a partir de la posición actual for(int j = i; j < nums.length; j++) { if (nums[j] < nums[min]) min = j; } // Cambiamos el actual por el más pequeño y vamos al siguiente double tmp = nums[i]; nums[i] = nums[min]; nums[min] = tmp; } }
Resuelve el problema en el que un thread (productor) prepara datos para que sean procesados por otro thread (consumidor). Dicho problema consiste en que, como no podemos controlar cuando se ejecuta ni uno ni otro, hay que impedir que el consumidor consuma más rápido de lo que el productor produce.
Se utilizará las siguientes instrucciones signal y wait, y mutex.lock y mutex.unlock.
Las instrucciones produce corresponden a la lectura del elemento, place a la colocación del elemento en el array (o lugar intermedio entre el productor y consumidor, la memoria compartida por los dos), take corresponde a la recogida del elemento del array y consume al proceso del dato.
La solución más sencilla nos viene cuando el array es infinito y utilizando el signal\wait: mientras existen elementos en el array el consumidor irá consumiendo, si no se esperará (itemsReady se ha de inicializar a 0):
producer: consumer:
forever forever
produce(item) itemsReady.wait()
place(item) take(item)
itemsReady.signal() consume(item)
En el caso en el que hayan varios productores y varios consumidores
producer: consumer:
forever forever
produce(item) itemsReady.wait()
mutexP.lock() mutexC.lock()
place(item) take(item)
mutexP.unlock() mutexC.unlock()
itemsReady.signal() consume(item)
function desordenaArray (v) { var len = v.length; var vTmp = new Array (); var j; for (i = 0; i < len; i++) { j = Math.round(Math.random()*((len-i-1))); // random que de un numero entre el 0 y (len - i - 1) vTmp[i] = v[j]; v[j] = v[len-i-1]; } return vTmp; }
pos = (pos + 1) % length; array[pos] = elem;
Para un ejercicio en el que se nos pedía rellenar un array de 10 posiciones con números aleatorios se nos dió dos posibles soluciones:
Luego se nos mostró otra tercera forma de implementarlo:
Qué conseguimos: Para diez valores no veríamos la diferencia, pero, por ejemplo para 3000? Además sólo es necesario un simple for, mientras que en los anteriores necesitaríamos un segundo bucle que generase números aleatorios hasta que no estén repetidos.
Este algoritmo intercambia el valor de dos integers:
procedure AddSwap (var X, Y: integer);
begin
if X <> Y then begin
X := X + Y;
Y := X - Y;
X := X - Y
end
end
Ejemplo:
x = 5 y = 8 x = x + y -> x = 13 y = x - y -> y = 5 x = x - y -> x = 8