Entonces, básicamente, desea saber si hay algún algoritmo de clasificación que no se degradaría de su caso promedio si se le da una función de comparación similar a:
int Compare(object a, object b) { return Random.Next(-1,1); }
... donde Random.Next () es un método que producirá un número entero generado aleatoriamente entre un límite inferior y superior inclusivo especificado.
La respuesta es en realidad que los algoritmos de clasificación más básicos funcionarán de acuerdo con su caso promedio, porque obedecen al menos una de las siguientes dos condiciones:
- Una comparación entre dos elementos únicos nunca se hace dos veces en el orden, y / o
- En cada iteración de la clasificación, se determina la posición correcta de al menos un elemento y, por lo tanto, ese elemento nunca se vuelve a comparar.
Por ejemplo, SelectionSort itera a través de la sublista de elementos sin clasificar, encuentra el elemento "menor" y / o "mayor" (al comparar cada uno con el mayor hasta ahora), lo coloca en su posición correcta y se repite. Como resultado, incluso con un comparador no determinista, al final de cada iteración, el algoritmo habrá encontrado un valor que considera menor o mayor, lo intercambia con el elemento en la posición que está tratando de determinar, y nunca lo considera ese elemento nuevamente, por lo tanto, obedece la Condición 2. Sin embargo, un A y B se pueden comparar varias veces durante este proceso (como el ejemplo más extremo, considere varios pases de SelectionSort en una matriz que está ordenada en orden inverso) por lo que viola la Condición 1 .
MergeSort obedece la Condición 1 pero no 2; a medida que se fusionan los subconjuntos, los elementos en el mismo subconjunto (en el lado izquierdo o derecho) no se comparan entre sí porque ya se ha determinado que los elementos en ese lado del conjunto están en orden entre sí; el algoritmo solo compara el elemento menos no combinado de cada subconjunto con el otro para determinar cuál es menor y debe ir a continuación en la lista combinada. Esto significa que dos objetos únicos A y B se compararán entre sí un máximo de una vez, pero el índice "final" de cualquier elemento dado en la colección completa no se conoce hasta que el algoritmo esté completo.
InsertionSort también obedece solo a la Condición 1 a pesar de que su estrategia y complejidad generales se parecen más a SelectionSort. Cada elemento sin clasificar se compara con los elementos ordenados, el más grande primero, hasta que se encuentra uno que es menor que el elemento bajo inspección. el elemento se inserta en ese punto y luego se considera el siguiente elemento. El resultado es que el orden relativo de cualquier A y B se determina mediante una comparación, y nunca se realizan más comparaciones entre A y B, pero la posición final de cualquier elemento no puede conocerse hasta que se consideren todos los elementos.
QuickSort obedece a ambosCondiciones. En cada nivel, se elige un pivote y se dispone de manera que el lado "izquierdo" contenga elementos menores que el pivote y el lado "derecho" contenga elementos mayores que el pivote. El resultado de ese nivel es QuickSort (izquierda) + pivote + QuickSort (derecha), lo que básicamente significa que se conoce la posición del elemento pivote (un índice mayor que la longitud del lado izquierdo), el pivote nunca se compara con ningún otro elemento después de que se haya elegido como pivote (puede haber sido comparado con elementos de pivote anteriores, pero esos elementos también se conocen y no se incluyen en ninguna submatriz), y cualquier A y B que terminen en lados opuestos del pivote nunca comparado. En la mayoría de las implementaciones de QuickSort puro, el caso base es un elemento, en cuyo punto su índice actual es su índice final y no se hacen más comparaciones.
( 2 / 3 )norte- 1) A medida que aumenta el valor absoluto máximo del resultado del comparador, la probabilidad de que cualquier comparación regrese negativa o cero disminuye hacia .5, lo que hace que la posibilidad de finalizar el algoritmo sea mucho menos probable (la posibilidad de que la moneda 99 arroje todas las cabezas de aterrizaje) , que es básicamente lo que se reduce a esto, es 1 en 1.2 * 10 30 )
EDITE MUCHO TIEMPO DESPUÉS: Hay algunos "tipos" diseñados específicamente como ejemplos de lo que no se debe hacer que incorporan un comparador aleatorio; Quizás el más famoso es BogoSort. "Dada una lista, si la lista no está en orden, baraje la lista y verifique nuevamente". Teóricamente, finalmente alcanzará la permutación correcta de valores, al igual que el "BubbleSort no optimizado" anterior, pero el caso promedio es tiempo factorial (N! / 2), y debido al problema del cumpleaños (después de suficientes permutaciones aleatorias, usted es más probable que encuentre permutaciones duplicadas que las únicas) existe una posibilidad distinta de cero de que el algoritmo nunca se complete para oficialmente que el algoritmo no tenga límites de tiempo.