mergesor-Deutsche

Want create site? Find Free WordPress Themes and plugins.

Merge Sort

Titel:

Merge Sort

Sprache:

C

Autor:

Philip J. Erdelsky

Datum:

31. Juli 1998

Nutzung:

Öffentliche Bereiche; gibt es keine Einschränkungen bei der Verwendung

Portabilität:

Welche C-Compiler

Stichwort:

sortieren

Abstract:

AC Funktion Dateien zum Sortieren, eine beliebige Lese verwenden, schreiben und Vergleichsfunktion und Tape-Merge-Algorithmus, der O (n log n) in allen Fällen. Seine Funktion ist nicht-rekursive und einspringenden.

Merge_sort function () wird eine Art fast jede Art von Datei, mit Lesen, Schreiben und Vergleichsfunktion vom Aufrufer zur Verfügung gestellt.

  1. Diese Art von variabler Größe Aufzeichnungen.
  2. Es dauert O-Vergleiche (n log n), wobei n die Anzahl der Datensätze, unabhängig von der ursprünglichen Bestellung ist. Zeit die Dateien vorhersehbar und konsistent zu sortieren. Dies ist eine optimale Leistung für gängige Typen bekannt.
  3. Die Anzahl der Male ein Datensatz aus gelesen oder geschrieben werden muss, eine Plattendatei ist auch O (n log n).
  4. Dieser Algorithmus wird wiederholt, nicht rekursiv, so dass es keine Stapelüberlaufproblem. Begriffe stapeln vorhersehbarer und klein.
  5. Es erfordert etwa genügend Speicherplatz zwei Kopien der Datei zu halten. Dateien angeordnet in diesem Raum gelassen.
  6. Es erfordert mindestens genügend Speicher drei Datensätze gespeichert halten können, aber es wird schneller laufen, wenn mehr Speicher gegeben.
  7. Er fordert tmpfile () vier temporäre Dateien zu einem Zeitpunkt, zu erstellen.
  8. Die Datei wird sequentiell geordnet und sortiert Datei wird sequentiell geschrieben. Daher können sie Bänder, I / O-Stream oder andere Vorrichtungen sein, sequentiell enger.

Die Funktionsaufrufe sind wie folgt:

Ergebnis = merge_sort (unsorted_file, sorted_file, lesen, schreiben, zu vergleichen,
Zeiger, max_record_size, block_size, PCOUNT);

Das rufende Programm muss die folgenden Parameter zur Verfügung stellen:

FILE * unsorted_file;

Ein Dateizeiger der Datei sortiert werden. sollte Datei wurde für das Lesen, und der Dateizeiger sollte am Anfang der Datei geöffnet positioniert werden.

FILE * sorted_file;

Ein Dateizeiger der Datei sortiert. sollte Datei wurde zum Schreiben und der Dateizeiger sollte am Anfang der Datei geöffnet positioniert werden.

int (* lesen) ();

Eine Funktion, die die Notiz liest.

int (* write) ();

Eine Funktion, die eine Notiz schreibt.

int (* Vergleich) ();

Eine Funktion, die zwei Datensätze vergleicht.

void * Zeiger;

Ein benutzerdefinierter Zeiger auf weitergeleitet werden (* lesen) (), (* write) () und (* Vergleich) () Funktion, wenn sie aufgerufen werden.

max_record_size ohne Vorzeichen;

Die maximale Anzahl von Bytes in der Aufzeichnung, wenn es in den Speicher gelesen. Dies muss nicht die gleiche wie die Größe des Datensatzes, wenn es in einer Datei ist.

unsigned long block_size;

Die Anzahl der Datensätze im Speicher sortiert werden, oder 1L, wenn der Sortierspeicher nicht verwendet werden.

unsigned long * PCOUNT;

Ein Zeiger auf eine Variable, die die Anzahl der Datensätze (wenn diese Art von Arbeit) oder NULL zu erhalten, wenn diese Informationen nicht zurückgegeben wurde.

Die Funktion gibt die folgenden Werte:

int result;

Ergebnis-Codes:

  • 0 bis Art von Erfolg
  • 1 bis Gedächtnis ist nicht genug
  • 2 für Dateierstellung Fehler
  • 3 für Fehler beim Schreiben Datei

Die Dateien werden sortiert und sortiert nicht wiedergeben oder geschlossen ist. Jede Datei offen gelassen wird, der Dateizeiger am Ende der Datei positioniert. Wenn jedoch zwei identische Zeiger-Datei, wird die Datei zurückgespult und sortiert Datensätze werden auf sie geschrieben werden.

Die (* Lese) () Funktion von merge_sort () aufgerufen wird wie folgt und einen Datensatz, wenn genannt lesen muss (außer Ende unsortierte Dateien erkannt):

n = (lesen) (fp, Puffer, Zeiger);

FILE * fp;

Ein Dateizeiger in einer Datei sortiert ist oder temporäre Dateien durch Aufruf tmpfile () erstellt.

void * Puffer;

Ein Zeiger auf den Puffer, den Datensatz zu empfangen. Dieser Puffer kann die meisten max_record_size Byte halten.

void * Zeiger;

Kopiert Zeiger als Argument übergeben zu merge_sort ().

int n;

Die Anzahl der Bytes in der Aufzeichnung, oder Null, wenn Versuche über das Ende einer Datei gelesen werden, das nicht getrennt ist.

Wenn diese Funktion Null zurückkehrt, wird nicht wieder für die gleiche Datei aufgerufen werden. Kein Versuch wird gemacht über das Ende der temporären Datei zu lesen.

Ein Datensatz, der größer ist als die angegebene maximale Größe ist, sollte auf andere geeignete Weise geschnitten oder bearbeitet werden. Funktion wird katastrophal versagen, wenn der Puffer darf überzulaufen, oder wenn der Wert zurückgegeben durch die (* lesen) () größer ist als die maximale Datensatzgröße.

Aufnahmeformat kann geändert werden, wenn es in den Speicher geladen wird, vorausgesetzt, dass:

  1. Die Änderungen sind kompatibel mit (* write) () und (* Vergleich) () Funktion und
  2. Der zurückgegebene Wert von () Funktion (* lesen) die Anzahl der Bytes in der Aufzeichnung zu sein, wenn Sie in den Pufferspeicher sind.

Zum Beispiel kann umgewandelt werden ein Leitungsabschluss \ r \ n in DOS / Windows \ n, wenn sie in den Speicher gelesen.

Die (* write) () Funktion wird wie folgt aufgerufen und hatte eine Note jedes Mal, es zu schreiben heißt:

n = (* write) (fp, Puffer, Zeiger);

FILE * fp;

Ein Zeiger auf die Datei sortiert Datei oder temporäre Dateien erstellt von tmpfile () aufrufen.

void * Puffer;

Ein Zeiger auf den Puffer hält einen Ton, wie in den Speicher gelesen durch (* read) ().

void * Zeiger;

Kopiert Zeiger als Argument übergeben zu merge_sort ().

int n;

Null zu einem Erfolg zu schreiben; Null für nicht genügend Speicherplatz.

Beachten Sie, dass die Länge des Datensatzes nicht als Parameter übergeben wird. Es sollte sich in dem Datensatz enthalten sind, explizit oder implizit, oder in einigen () Funktion an anderen Orten kann durch (* write) zugegriffen werden.

Die (* Vergleich) () Funktion wird aufgerufen, die beiden Datensätze zu vergleichen, wie folgt:

n = (* Vergleich) (p, q, Zeiger);

void * p;

Ein Zeiger auf den Puffer auf den ersten Datensatz enthält, wie in den Speicher gelesen mit (* gelesen) ().

void * q;

Ein Zeiger auf den Puffer, der den zweiten Datensatz enthält, wie es in den Speicher gelesen mit (* read) ().

void * Zeiger;

Kopiert Zeiger als Argument übergeben zu merge_sort ().

int n;

Die Ergebnisse des Vergleichs wie folgt:

  • > 0, wenn * p zu werden, nachdem * q sortiert werden
  • <0, wenn * p * q ist vor sein Sortier
  • 0, wenn die Sequenz * p * q und irrelevant

Sortieren Sie die Ergebnisse wie folgt:

  1. Aufzeichnungen aus der Datei gelesen wird sortiert und auf zwei temporäre Dateien in den Block geschrieben. Jeder Block enthält die Anzahl der Datensätze durch das Argument block_size angegeben (mit Ausnahme des letzten Blocks, die weniger Datensätze enthalten kann), und sortierte im Speicher durch den Aufruf linked_list_sort (), bevor es in eine temporäre Datei geschrieben wird.
  2. Temporäre Dateien werden dann durch die Kombination von Blöcken in einer Reihe von Durchgängen sortiert. In jedem Durchlauf werden ein Block von zwei Quelldateien in Blöcken zusammengefasst doppelt so viele Datensätze enthält, und mit zwei Ausgangsdateien geschrieben. Der Prozess endet, wenn die Blockgröße gleich oder die Größe der Datei und alle Datensätze in den Dateien überschreitet, welche Dateien sortiert.

Der Typ kann fehlschlagen, wenn

  1. Fordert malloc () gibt NULL zurück, da nicht genügend Speicher vorhanden ist, oder
  2. Fordert die tmpfile () gibt NULL, weil es zu viele offene Dateien sind, oder
  3. Fordert (* write) () gibt Null, da es nicht genügend Speicherplatz vorhanden ist.

Ist diese Art von Arbeit oder nicht, alle Speicherblock zugewiesen werden freigegeben, und alle temporären Dateien werden geschlossen und entfernt werden. Wenn ein solches Versagen, sortiert der Dateizeiger auf die Datei und sortiert aufgegeben werden, wo immer sie auftreten.

Die merge_sort () Funktion einspringende, wenn sie rufen Funktionen sind einspringende:

  • (* Vergleichen) ()
  • fclose ()
  • free ()
  • malloc ()
  • memcpy ()
  • (* Read lesen) ()
  • Zurückspulen ()
  • tmpfile ()
  • (* Write) ()

Unter DOS / Windows, tmpfile () erzeugt eine Binärdatei. Allerdings ist dies in der Regel keine Probleme verursachen, selbst wenn die Datei sortiert und geordnet ist eine Textdatei, für DOS / Windows die Umwandlung konsistent zu handhaben.

Wenn der Speicherplatz sehr eng ist, so etwas kann geändert werden, um den Raum, der durch die Datei belegt zu verwenden, wird nicht getrennt. Unsortierten Dateien, temporäre Dateien und Dateien können dann in den Zwischenraum von etwa zwei mal größer Datei sortiert sortiert werden. Um diese Änderungen vorzunehmen, geben Sie einfach den Code, um die Dateien zu entfernen sortiert, nachdem es gelesen wurde. Beachten Sie, dass, wenn diese Technik verwendet wird, Dateien sortiert und sortiert werden, anders zu sein, und Argumente über die Struktur kann ein wenig weniger elegant als Funktionsaufruf sein, um die Dateien zu löschen, erfordert in der Regel eine Spezifikationsdatei, anstatt nur den Dateizeiger.

Die merge_sort () Funktion ist nicht stabil; dh, es nicht die relative Position der zwei Datensätze für die Aufrechterhaltung (* Vergleich) () Funktion gibt Null. Stable_merge_sort Funktion () macht diese Eigenschaft haben. Allerdings tragen zusätzliche Funktionen einen Preis: eine Rekordzahl von vier Bytes zu jedem Datensatz hinzugefügt, während es im internen Speicher oder temporäre Dateien ist. Dies erhöht die Festplatten- und Speicheranforderungen, deren Höhe sich, wenn eine kleine Notiz ist groß.

SORT-Dienstprogramm zeigt die Verwendung stable_merge_sort (). Dies ist ein DOS oder UNIX-Filter, der Textzeilen Dateien sortiert. Die maximale Leitungslänge ist Zeichen MAX_LINE, ohne Wagenrücklauf und Zeilenvorschub am Ende jeder Zeile. Das Dienstprogramm wird die Sortierung abzubrechen und eine Fehlermeldung angezeigt, wenn Zeilen lesen, die mehr als MAX_LINE Zeichen. MAX_LINE Wert auf 255, gesetzt, kann aber durch erneutes Kompilieren das Dienstprogramm geändert werden.

Das Dienstprogramm wird wie folgt aufgerufen:

SORT <unsorted_file> sorted_file MN

Diese Art einschließlich der Anzahl von Spalten M bis N, einschließlich, bei der die linke Spalte ist die Zahl Null. Wenn N weggelassen wird, sort einschließlich M Spalten und alle Spalten rechts davon. Wenn sowohl M und N angegeben ist, werden alle Spalten in der Art verwendet.

Eine Linie, die weniger als N + 1 Spalten enthält, werden so sortiert, als ob es mit Nullen am rechten Ende aufgefüllt wurden.

Charaktere auf Platz durch ihre ASCII-Code, als Byte ohne Vorzeichen betrachtet.

Dieses Paket fordert andere Pakete:

Der Quellcode im Textformat:

Did you find apk for android? You can find new Free Android Games and apps.