Então, basicamente, você deseja saber se existe algum algoritmo de classificação que não seria degradado do seu caso médio se receber uma função de comparação semelhante a:
int Compare(object a, object b) { return Random.Next(-1,1); }
... em que Random.Next () é um método que produzirá um número inteiro gerado aleatoriamente entre um limite inferior e superior inclusivo especificado.
A resposta é, na verdade, que os algoritmos de classificação mais básicos serão executados de acordo com o caso médio, porque eles obedecem a pelo menos uma das duas condições a seguir:
- Uma comparação entre dois elementos únicos nunca é feita duas vezes na classificação e / ou
- Em cada iteração da classificação, a posição correta de pelo menos um elemento é determinada e, para que esse elemento nunca seja comparado novamente.
Por exemplo, SelectionSort percorre a sub-lista de elementos não classificados, encontra o elemento "mínimo" e / ou "maior" (comparando cada um com o maior até agora), coloca-o em sua posição correta e repete. Como resultado, mesmo com um comparador não determinístico, no final de cada iteração, o algoritmo encontrou um valor que considera menor ou maior, troca-o pelo elemento na posição que está tentando determinar e nunca considera esse elemento novamente, portanto, ele obedece à condição 2. No entanto, um A e B podem ser comparados várias vezes durante esse processo (como o exemplo mais extremo, considere várias passagens de SelectionSort em uma matriz classificada em ordem inversa), por isso viola a condição 1 .
MergeSort obedece à condição 1, mas não 2; À medida que as sub-matrizes são mescladas, os elementos na mesma sub-matriz (no lado esquerdo ou direito) não são comparados entre si porque já foi determinado que os elementos desse lado da matriz estão em ordem entre si; o algoritmo compara apenas o elemento menos imerso de cada sub-matriz com o outro para determinar qual é menor e deve seguir em seguida na lista mesclada. Isso significa que quaisquer dois objetos exclusivos A e B serão comparados entre si no máximo uma vez, mas o índice "final" de qualquer elemento na coleção completa não será conhecido até que o algoritmo esteja completo.
O InsertionSort obedece apenas à Condição 1, apesar de sua estratégia e complexidade gerais parecerem mais com SelectionSort. Cada elemento não classificado é comparado aos elementos classificados, o maior primeiro, até encontrar um que seja menor que o elemento sob inspeção. o elemento é inserido nesse ponto e, em seguida, o próximo elemento é considerado. O resultado é que a ordem relativa de qualquer A e B é determinada por uma comparação e nunca são realizadas comparações adicionais entre A e B, mas a posição final de qualquer elemento não pode ser conhecida até que todos os elementos sejam considerados.
O QuickSort obedece a ambosCondições. Em cada nível, um pivô é escolhido e organizado de forma que o lado "esquerdo" contenha elementos menos que o pivô e o lado "direito" contenha elementos maiores que o pivô. O resultado desse nível é QuickSort (esquerda) + pivô + QuickSort (direita), o que basicamente significa que a posição do elemento pivô é conhecida (um índice maior que o comprimento do lado esquerdo); o pivô nunca é comparado a qualquer outro elemento depois de ter sido escolhido como um pivô (ele pode ter sido comparado com elementos de pivô anteriores, mas esses elementos também são conhecidos e não estão incluídos em nenhum sub-arranjo) E os A e B que terminam em lados opostos do pivô nunca são comparado. Na maioria das implementações do QuickSort puro, o caso base é um elemento; nesse momento, o índice atual é o índice final e nenhuma comparação adicional é feita.
( 2 / 3 )N- 1) À medida que o valor absoluto máximo do resultado do comparador aumenta, a probabilidade de qualquer comparação retornar negativo ou zero diminui para 0,5, tornando a chance de terminar o algoritmo muito menos provável (a chance de 99 moedas vira todas as cabeças de aterrissagem , que é basicamente o que isso se resume, é 1 em 1,2 * 10 30 )
EDITAR MUITO TEMPO DEPOIS: Existem alguns "tipos" projetados especificamente como exemplos do que não fazer que incorporam um comparador aleatório; talvez o mais famoso seja o BogoSort. "Dada uma lista, se a lista não estiver em ordem, embaralhe a lista e verifique novamente". Teoricamente, acabará atingindo a permutação correta de valores, assim como o "BubbleSort não otimizado" acima, mas o caso médio é de fatorial (N! / 2) e devido ao problema de aniversário (após permutações aleatórias suficientes maior probabilidade de encontrar permutações duplicadas do que as únicas) existe uma possibilidade diferente de zero de o algoritmo nunca concluir para oficialmente o algoritmo não ter limite de tempo.