Nota, lea la parte inferior de esta respuesta para ver por qué es realmente posible hacer el problema. Leí la pregunta mal.
No es posible en el caso general. Considere la lista:
n, n-1, n-2 ... 4, 3, 2, 1
Los pares serán:
(n, n-1), (n , n-2) ... (n, 2), (n, 1), (n-1, n-2), (n-1, n-3) ... ... (3, 2) , (3, 1), (2, 1)
por lo tanto hay O (n^2) pares y por lo tanto la lista no se puede construir en O (n log n)
sin embargo, se puede hacer esto con un pase de la lista:
- comenzar al final de la lista y trabajar con las contraseñas.
- mientras se desplaza por la lista mantenga un montón de los números que ha visto (esto hará que el bucle sea O (n log n))
- por cada número que encuentre haga una búsqueda en el montón para encontrar todos los números que son menos que el número en el que se encuentra actualmente. Muestra el número actual y el número en el montón como un par. (Esto es O (n log n) para encontrar el primer partido en el montón, pero será O (n) para encontrar todos los números más pequeños)
Para su ejemplo:
La lista: 3 4 1 6 7 3
comenzando en el segundo elemento
montón (3) artículo (7)
de salida (7, 3)
montón (3, 7) elemento (6)
búsqueda y encontrar los 7, la salida (6, 3)
montón (3, 6, 7) elemento (1)
buscar y encontrar nada
montón (1, 3, 6, 7) material (4)
búsqueda y encontrar los 3 y 1. salida (4, 3) (4, 1)
etc ....
Edición, es posible realidad
Desde JoshD observó correctamente que estamos buscando el número de elementos, se puede utilizar un árbol B en lugar de un montón y entonces se puede obtener sólo la cuenta de elementos menos que el elemento actual y agregarlo a un contador.
¿Qué les dijiste? ¿Qué te dijeron? – tster
di O (n^2) soln con 2 bucles. dijeron que hay un O (nlogn) uno – Nemo
http://stackoverflow.com/questions/337664/counting-inversions-in-an-array? – Rsh