Su enfoque tipo mergesort parece muy razonable. Más generalmente, este tipo de algoritmo de clasificación se llama external sorting algorithm. Estos algoritmos a menudo funcionan como usted ha descrito: cargue algún subconjunto de datos en la memoria, oriéntelos y luego vuelva a escribirlos en el disco. Al final, use un algoritmo de fusión para fusionar todo nuevamente. La elección de cuánto cargar y qué algoritmo de ordenamiento usar son usualmente las preocupaciones dominantes. Me centraré principalmente en la elección del algoritmo de clasificación.
Sus preocupaciones sobre el peor de los casos de comportamiento del quicksort son hablando en general nada de qué preocuparse, ya que si elige el pivote aleatoriamente la probabilidad de que obtenga un tiempo de ejecución realmente malo es baja. La estrategia de pivote aleatorio también funciona bien incluso si los datos ya están ordenados, ya que no tiene entradas para el peor de los casos (a menos que alguien conozca su generador de números aleatorios y la semilla). También puede usar una variante de quicksort como introsort, que no tiene el peor de los casos, como algoritmo de clasificación para evitar este peor caso.
Dicho esto, ya que sabe que los datos ya están parcialmente ordenados, es posible que desee consultar un adaptive sorting algorithm para su paso de clasificación. Mencionó la ordenación por inserción para esto, pero hay algoritmos adaptativos mucho mejores. Si la memoria es escasa (como ha descrito), puede intentar buscar en el algoritmo smoothsort, que tiene el tiempo de ejecución del mejor de los casos O (n), el tiempo de ejecución del peor caso O (n log n) y solo utiliza O (1) memoria. No es tan adaptativo como otros algoritmos (como el de Python timsort, natural mergesort o Cartesian tree sort), pero tiene un menor uso de memoria. Tampoco es tan rápido como un buen quicksort, pero si la mayoría de los datos están realmente ordenados, puede funcionar bastante bien.
Espero que esto ayude!
¿Es esta tarea? Tiene un aire de preparación para ello. –
debe considerar poner esto en la sección de programadores. – Rudy
no, revisando estructuras de datos. Acabo de encontrar algunas lecciones increíbles en you tube, de UCBerkley y estoy tratando de ejercitarme con algoritmos de clasificación. – FranXh