he estado pensando en esto un poco más, y creo que se logre el o (n log (n) el tiempo) y O (1) condición espacial con Merge ordenar.
Veamos ...
Tome la lista:
3 -> 2 -> 1 -> 5 -> 6 -> 4
Primer paso:
Establecer un puntero para el primero, segundo término y 3er términos
Establezca el término más pequeño entre el 1er y el segundo puntero para señalar el término más grande.
Establezca el último de los 2 términos para que apunte al resto de la lista original.
Repita hasta el final de la lista.
2 -> 3 -> 1 -> 5 -> 4 -> 6
En este punto, cada par de términos está ordenado.
pase enésimo:
Establecer un puntero a la primera, (2^(N-1)) -ésimo, y (2^(n)) + 1 th términos
Tome el nodo valorado más pequeño e incrementar su puntero .
Repita el proceso hasta que se agoten ambas listas (de longitud 2^N), añadiendo el nodo valorado más pequeño cada vez al nodo valorado más pequeño anterior.
Establezca el puntero al resto de la lista original.
Repita hasta el final de la lista.
pase 0 ª: 3 -> 2 -> 1 -> 5 -> 6 -> 4 (cada bloque de 1 plazo se ordena) (trivial)
primero pase: 2 -> 3 -> 1 -> 5 -> 4 -> 6 (se ordena cada bloque de 2 términos)
2º paso: 1 -> 2 -> 3 -> 5 -> 4 -> 6 (se ordena cada bloque de 4 términos)
3er paso: 1 -> 2 -> 3 -> 4 -> 5 -> 6 (se ordena cada bloque de 8 términos)
Tiempo: log (n) pasa, con n comparaciones para cada pase.
O (n log (n))
espacio: las variables de puntero y enteros
O (1)
tarea? Si es así, indique qué tan lejos ha llegado hasta el momento. –
posible duplicado de [Ordenando una lista vinculada] (http://stackoverflow.com/questions/768095/sorting-a-linked-list) – kennytm