Wie implementiert man klassische Sortieralgorithmen in modernem C ++?

Den std::sort Algorithmus (und seiner Vettern std::partial_sort und std::nth_element) aus der C++ Standard-Bibliothek ist in den meisten Implementierungen eine komplizierte und hybride Verschmelzung von mehr elementaren Sortier-algorithmenwie selection sort, insertion-sort, quick-sort, merge-sort oder heap-sort.

Gibt es viele Fragen, die hier und auf den Schwester-Websites, wie https://codereview.stackexchange.com/ Bezug auf bugs, die Komplexität und andere Aspekte der Implementierungen dieser klassischen Sortier-algorithmen. Die meisten der angebotenen Implementierungen bestehen aus roh Schleifen, verwenden Sie index-manipulation und Beton-Arten, und sind im Allgemeinen nicht-trivial zu analysieren, in Bezug auf Richtigkeit und Effizienz.

Frage: wie können die oben genannten klassischen Sortier-algorithmen implementiert werden unter Verwendung moderner C++?

  • keine rohen loopsaber die Kombination der Standard-Bibliothek Algorithmische Bausteine aus <algorithm>
  • iterator-interface und Verwendung von Vorlagen anstelle von index-manipulation und konkrete Typen
  • C++14 styledarunter die gesamte Standard-Bibliothek als auch als syntaktische Geräusch-Reduzier-wie auto Vorlage Aliase, transparente Komparatoren und der polymorphe Lambda-Ausdrücke.

Hinweise:

  • für weitere Verweise auf Implementierungen von algorithmen zur Sortierung siehe WikipediaRosetta Code oder http://www.sorting-algorithms.com/
  • nach Sean Eltern Konventionen (Folie 39), ein raw-Schleife ist eine for-Schleife länger als Komposition von zwei Funktionen mit einem operator. So f(g(x)); oder f(x); g(x); oder f(x) + g(x); sind nicht roh Schleifen, und weder sind die loops in selection_sort und insertion_sort unten.
  • Folge ich Scott Meyers Terminologie für die Bezeichnung der aktuellen C++1y bereits als C++14, und bezeichnen C++98 und C++03, sowohl als C++98, so don ' T flame me.
  • Wie vorgeschlagen, in den Kommentaren von @Mehrdad, ich biete vier Implementierungen, die als Live-Beispiel am Ende die Antwort: C++14, C++11, C++98 und Boost und C++98.
  • Die Antwort ist in Bezug auf die C++14 nur. Wo dies relevant ist, ich bezeichne die syntaktische und Bibliothek unterschieden, wobei die verschiedenen Sprachfassungen voneinander abweichen.

InformationsquelleAutor der Frage TemplateRex | 2014-07-09

Schreibe einen Kommentar