2010-06-19 5 views
15

Gibt es einen Sortieralgorithmus namens "binary sort"? Wie merge sort, selection sort oder die anderen Arten der Sortierung existiert eine binäre Sortierung?Gibt es einen "binären Sortier" -Algorithmus?

+1

Vielleicht meinen Sie [Binärsuche] (http://en.wikipedia.org/wiki/Binary_search_algorithm)?In jedem Fall liefert Ihre Frage nicht genügend Informationen für aussagekräftige Antworten. Bitte nehmen Sie sich Zeit und schreiben Sie die Frage neu, um nützliche Informationen/Details hinzuzufügen. –

+1

@Paul @pst Ich sehe deine Probleme nicht beim Verstehen der Antwort: Gibt es einen populären Sortieralgorithmus, dessen Name "binäre Sortierung" ist? –

+1

@Dave: Ich habe auf die ursprüngliche Frage geantwortet, die noch kürzer und vager als die aktuelle Version war - schauen Sie sich die Änderungen an. –

Antwort

10

Es gibt this und es gibt binary insertion sort. Die beiden sind ziemlich ähnlich. Sie sind beide quadratische (O(n^2)) Zeitalgorithmen.

Beide Algorithmen tun O(n log n) Anzahl der Vergleiche, aber in der Praxis müssten Sie auch Elemente bewegen, die den gesamten Algorithmus quadratisch machen würde.

+0

Ich möchte einen Algorithmus schreiben (dies ist keine Heimarbeit) und ich möchte zuerst sortieren und dann binäre Suche verwenden, um zwei Elemente zu finden, deren Summe gleich 9 ist und die Laufzeit dieses Algorithmus sollte theta (nlogn) sein kann ich Merge-Sortierung für Sortierung und Binärsuche für Suche verwenden? – user355002

+0

auch danke für Ihre Hilfe !!! – user355002

+0

@ matin1234: nope.aber Sie können die Zahlen mehr als 8. und sortieren Sie die linken Zahlen, Schleife von oben und unten (es ist ein wenig seltsam) für Zahlen ergibt sich eine Summe von neun. Es ist O (n). – Behrooz

0

Es gibt einige Arten, die das Teilen in zwei Peices beinhalten (merge sort), aber ich glaube nicht, dass es eine Sorte gibt, die genau "binary sort" genannt wird.

0

Wir haben keinen binären Sortieralgorithmus, aber wir haben eine binäre Suche in einem sortierten Array.

0

Nicht sicher, wonach Sie suchen, aber wenn Sie nach einem geeigneten binären Sortieralgorithmus suchen, dann sollten Sie sich Ihrer Anforderungen bewusst sein. Jeder Algorithmus hat seine eigenen Stärken und Schwächen. Suchen Sie beispielsweise nach einem Algorithmus, der die schnellste durchschnittliche Leistung (z. B. die Heap-Suche) oder die schnellste Leistung im schlechtesten Fall (langsamste Operation) liefert (z. B. balancierter Binärbaum). Einige sind langsam, wenn Sie auch von einem Element zum nächsten iterieren müssen. Wenn Sie viele zufällige Operationen ausführen, sind Sie wahrscheinlich eher an der durchschnittlichen Leistung interessiert. Wenn Sie jedoch sicherstellen müssen, dass jede Operation schneller als X Millisekunden ist, sollten Sie einen anderen Algorithmus verwenden. Einige können langsam sein, wenn Sie immer Einzelteile am Ende der Auflistung hinzufügen usw.

haben also eine Google nach Schlüsselwörtern wie:

Es kommt alles auf was Sie brauchen.

3

Eine binäre Sortierung ist ein sehr schneller Algorithmus, der Bit-Tests beinhaltet. Es hat einen einzigen Durchlauf für jedes Bit in dem sortierbaren Gegenstand. Wenn das Bit gesetzt ist, wird das sortierbare Element an jedem Ende des Puffers gestapelt. Wenn das Bit nicht gesetzt ist, wird das Element am anderen Ende des Puffers gestapelt. Das Starten der Sortierung mit dem niedrigstwertigen Bit und das Behandeln der nächsten Bits in aufsteigender Reihenfolge ergibt die sortierte Liste. Ich schrieb eines davon Anfang 8086 im Jahre 1983 für das Scottish Education Department. Steve Pitts

+2

Das klingt nach Radix-Art. Würden Sie weitere Erläuterungen dazu haben, wie sich der von Ihnen beschriebene Algorithmus von Radix unterscheidet? – javadba

3

Das JDK verwendet eine "binäre Sortierung" für Arrays < Größe 32 innerhalb seiner Arrays.sort() -Methode. Hier ist der Code von JDK7

private static void binarySort(Object[] a, int lo, int hi, int start) { 
    assert lo <= start && start <= hi; 
    if (start == lo) 
     start++; 
    for (; start < hi; start++) { 
     @SuppressWarnings("unchecked") 
     Comparable<Object> pivot = (Comparable) a[start]; 

     // Set left (and right) to the index where a[start] (pivot) belongs 
     int left = lo; 
     int right = start; 
     assert left <= right; 
     /* 
     * Invariants: 
     * pivot >= all in [lo, left). 
     * pivot < all in [right, start). 
     */ 
     while (left < right) { 
      int mid = (left + right) >>> 1; 
      if (pivot.compareTo(a[mid]) < 0) 
       right = mid; 
      else 
       left = mid + 1; 
     } 
     assert left == right; 

     /* 
     * The invariants still hold: pivot >= all in [lo, left) and 
     * pivot < all in [left, start), so pivot belongs at left. Note 
     * that if there are elements equal to pivot, left points to the 
     * first slot after them -- that's why this sort is stable. 
     * Slide elements over to make room for pivot. 
     */ 
     int n = start - left; // The number of elements to move 
     // Switch is just an optimization for arraycopy in default case 
     switch (n) { 
      case 2: a[left + 2] = a[left + 1]; 
      case 1: a[left + 1] = a[left]; 
        break; 
      default: System.arraycopy(a, left, a, left + 1, n); 
     } 
     a[left] = pivot; 
    } 
} 
+0

Dies ist ein Teil von TimSort Algo. Aber es sieht verschwommen aus. Kann jemand das erklären? Wie unterscheidet es sich bei der Zusammenführung? –

0

Es kann eine binäre Art sein, aber die tatsächliche Anordnung sollte in entgegengesetzter Richtung sortiert werden. (Dh Sagen Sie ein Array von ganzen Zahlen in aufsteigender Reihenfolge sortiert werden sollen ... für die , müssen Sie das tatsächliche Array in absteigender Reihenfolge haben.)

0

Heap Sortierung ist ein Sortieralgorithmus durch die Konzeption eines binären Baumes und tun, sieben und dann sieben auf sie. Es kann an Ort und Stelle erfolgen.

Verwandte Themen