Problem

1 /11


Sortieren nach Zählen

Theory Click to read/hide

Unterkontenabstufung
Anwendung
Die abstufbaren Zahlen haben einen Bereich möglicher positiver Werte, die relativ klein gegenüber den vielen sind. Beispielsweise beträgt eine Million Werte, die jeweils nicht mehr als 1.000 sind.
Algorithmen
(1) Wir haben eine Masse. А von N Komponenten einschließlich Zahlen im Bereich von 0 vor k-1 (lacht) k verschiedene Werte).
(2) Hilfsmasse erstellenC[0..k-1]bestehend aus Null. Kontrolle: Jede Zelle der Zähler speichert die Menge, die in der Referenzmasse auftritt А Anzahl der gleichen Index des MasseelementsC)
(3) Lesen Sie die Elemente der Masse A und für jeden A[i] Steigerung С[A[i]] pro Einheit. Am Ende kriegen wir die Masse. Cwobei jedes Element C[i] gleich der Anzahl der Kennwertei im Referenzbereich A, Index i gleich dem Wert des Masseelements A
(4) Durch die Masse kommen С und für jeden j von 0 vor k-1 in einen neuen Bereich (oder die Masse neu schreiben A(d) Nummer aufzeichnen j C[j] Eins.
Beispiel
Hab eine Masse. А = {2, 5, 6, 9, 4, 1, 8, 2, 9, 8, 4, 1, 4, 1}
Meißelbereich von 0 bis 9, also nur 10 verschiedene Werte.
ANHANG Aufbau der Masse С von 10 Nullelementen.
2. Wir gehen die Reichweite runter. А und Erhöhung um 1 Komponente С[A[i]]
3. Betrag С = {0, 3, 2, 0, 3, 1, 1, 0, 2, 2}

Dieses Verfahren kann auch angewendet werden, wenn negative Werte vorliegen, um die Anzahl der Elemente gleich dem niedrigsten (minor) zu berechnen.AminWir benutzen das Element С[0]Anzahli- der Masse A wie folgt umgesetzt werden:C[A[i] - Amin].

Beispiel des Algorithmus

Alles klar. А natürlich und zwischen 1 und 100 gelegen.

(1) Erstellen Sie einen Größenbereich.100in dem wir bleibenk- NummerkIch traf mich in dieser Masse.
(2) Wir gehen auf alle Zahlen der Bezugsmasse und erhöhen das entsprechende Gewicht der Masse1
(3) Nachdem wir gezählt haben, wie oft jede Zahl getroffen wurde, können Sie einfach durch diesen Körper gehen und raus.1So oft ich mich traf.12So oft ich mich traf.2und so weiter.

C+++PythonPascal
const int Nmax = 1000;
int c[100] = {0}, n;
int a[Nmax];
#
für (int i = 0; i À n; i+++)
c[a[i]++;

int k = 0;
für (int i = 0; i À 100; i+++)
während (c[i)
{~}
a[k] = i;
k++;
c[i]--
?
c = [0]*100
für i im Bereich (len(a)):
c[a[i] += 1

= 0
a=[0]*len(a)
für i im Bereich (100):
c[i] = 0:
a[k] = i
mit 1
c[i] -= 1

var
c: Array [0.99] ganzzahlig;
k, n, i: ganze Zahl;
#
für i: = 0 bis n-1 do
c[i] := 0;

für i: = 0 bis n-1 do
c[a[i] := c[a[i] + 1;

: = 0;
für i:= 0 bis 99 do
während c[i] À-Komponente 0 do
Anfang
a[k] := i)
k: = k + 1;
c[i] := c[i] - 1;
Ende;


Gesamtumfang der Probe

Was, wenn der Wertebereich (min und max) Nicht im Voraus bekannt? Was ist, wenn der Mindestwert größer als Null ist oder die klassifizierten Daten negativ sind?
Das erste Problem kann durch eine lineare Suche behoben werden min und maxdie nicht die asymptotische des Algorithmus beeinflussen.
Die zweite Frage ist etwas komplizierter. wenn min Mehr als Null ist es gut, mit der Masse zu arbeiten. C von A[i] Ja. minund fügen Sie es zum Datensatz hinzu. Wenn es negative Zahlen gibt, müssen wir mit der Masse arbeiten. C bis A[i] Hinzufügen |min|, und ich nehme es zurück.

Problem

Implementieren Sie einen Sortieralgorithmus für beliebige Zahlen, die modulo nicht größer als 10000 sind.
 
Eingabe
Zuerst wird dem Programm der Wert n <= 100000 – Anzahl der Elemente des Arrays zugeführt. In der nächsten Zeile befinden sich die Elemente selbst, ganze Zahlen, die modulo nicht größer sind als 10000.
 
Ausgabe
Geben Sie ein Array aus, das nach Unauslöschlichkeit sortiert ist.
 
Beispiele
Eingabe Ausgabe
1
5
1 3 4 2 5
1 2 3 4 5