Wir zählen die Anzahl der Lese- und Schreibvorgänge von Array-Elementen. Für die Blasensortierung benötigen Sie Zugriffe (das erste Schreiben bis zum Ende, im schlimmsten Fall zwei Lesevorgänge und zwei Schreibvorgänge für n Tauschvorgänge). Für die binäre Suche benötigen wir 2 log n + 2 n + 1 ( 2 log n für die binäre Suche, dann im schlimmsten Fall 2 n , um die Array-Elemente nach rechts zu verschieben, und 1, um das Array-Element zu schreiben seine richtige Position).1+4nn2logn+2n+12logn2n
Beide Methoden sind also für Array-Implementierungen gleich komplex, aber die binäre Suchmethode erfordert auf lange Sicht weniger Array-Zugriffe ... asymptotisch gesehen halb so viele. Natürlich spielen auch andere Faktoren eine Rolle.
Tatsächlich könnten Sie bessere Implementierungen verwenden und nur die tatsächlichen Array-Zugriffe zählen (keine Zugriffe auf das einzufügende Element). Sie könnten für die Blasensortierung ausführen und n + 2 n + 1 für die Binärsuche protokollieren. Wenn also der Register- / Cache-Zugriff billig und der Array-Zugriff teuer ist, suchen Sie vom Ende und verschieben sich auf dem Weg (intelligenter) Blasensortierung zum Einfügen) könnte besser sein, wenn auch nicht asymptotisch.2n+1logn+2n+1
Eine bessere Lösung könnte die Verwendung einer anderen Datenstruktur beinhalten. Arrays geben Ihnen O (1) -Zugriffe (Direktzugriff), aber Einfügungen und Löschungen können kosten. Eine Hash-Tabelle könnte O (1) -Einfügungen und -Löschungen enthalten, die Zugriffe würden kosten. Andere Optionen umfassen BSTs und Heaps usw. Es kann sich lohnen, die Verwendungsanforderungen Ihrer Anwendung für das Einfügen, Löschen und Zugreifen zu berücksichtigen und eine spezialisiertere Struktur zu wählen.
Beachten Sie, dass auch wenn Sie hinzufügen möchten Elemente zu einem sortierten Array von n Elementen, könnte eine gute Idee Art die effizient sein m Elemente, dann die beiden Arrays verschmelzen; Außerdem können sortierte Arrays effizient erstellt werden, indem z. B. Heaps (Heap-Sortierung) verwendet werden.mnm