Frage

Ich habe eine Reihe von n = 32 Elementen mit positiven und negativen Werten. Ersten n / 2 Elemente positiv sind und sortiert nach Wert und der zweite n / 2 Elemente negativ und nach Wert und sortiert. Ich möchte das gesamte Array von Wert sortieren, von dem kleinsten negativen Wert größten positiven Wert ausgehend, was bedeutet, wenn es 32 Elemente der ersten 16 (N / 2) Elemente sortierten soll die Werte der zweiten 16 Elemente des ursprünglichen Arrays enthält, und die zweiten 16 Elemente der sortierten Array sollten die ersten 16 Werte des ursprünglichen Arrays enthalten.

Hypothetisches Beispiel:

double[] original = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, -16, -15, ..., -1};

double[] sorted = {-16, -15, ...., -1, 1, 2, ..., 16};

Wer weiß, was der beste Weg ist, um die Elemente zu verschieben, um die sortierten Array von Original zu generieren?

Dieses Array ist durch die Art und Weise zu einem anderen Array gebunden, die nicht die Elemente nach ihrer Größe die gleiche Art und Weise sortiert haben und muss die gleiche Art und Weise wie ursprünglich verschoben werden, so dass die Anordnung nicht nach Größe sortiert werden soll, es hat sich verschoben werden.

War es hilfreich?

Lösung

So haben Sie eine zweite Array wollen, mit dem Inhalt des Originals, sondern an Orten verschoben? Entweder tut es ausdrücklich:

double[] result = new double[32];
for (int i=0; i < 32; i++)
{
    result[(i+16)%32] = original[i];
}

oder mit Array.Copy zweimal:

double[] result = new double[32];
Array.Copy(original, 0, result, 16, 16);
Array.Copy(original, 16, result, 0, 16);

Andere Tipps

Aufgrund der starren Natur des Problems, Array.Copy:

        int half = original.Length / 2;
        Array.Copy(original, 0, sorted, half, half);
        Array.Copy(original, half, sorted, 0, half);

Wie wäre es in Linq:

int half = original.Length/2;
var sorted = original.Skip(half).Concat(original.Take(half)).ToArray();

Haben Sie versucht:

Array.Sort(original);

Sie einfach einen Swap auf Element 0 und Element 16, 1 und 17, 2 und 18 .. etc.

Möchten Sie ein Array sortieren, basierend auf den Werten in einem anderen Array der gleichen Größe enthalten? Wenn ja, gehen Sie wie folgt:

Array.Sort(keys, values);

Hier ist die Dokumentation Array.Sort (Array Schlüssel, Array Artikel)

Jon Skeet und Marc GRA ♦ 's Antworten bieten die richtige Lösung, aber wenn Sie nicht wollen, eine zusätzliche Array zuweisen können Sie:

a) lösen Ihnen spezifisches Problem (die 2. Hälfte Verschiebung vor der ersten Hälfte sein) an Ort und Stelle:

private void Rotate1(double[] toRotate ) {
        int startOf2nd = toRotate.Length / 2;
        for (int i=0; i < toRotate.Length/2; i++) {
            double temp = toRotate [i];
            toRotate [i] = toRotate [i + startOf2nd];
            toRotate [i + startOf2nd] = temp;
        }
    }

Beachten Sie, dass dieser Code nicht mit einem Array mit einer ungeraden Anzahl von Elementen umgehen kann.

b) können Sie den Vektor-Verschiebung Algorithmus Ich weiß von Jon Bentley 'Programmierung Pearls' gelten:

 private void Rotate2(double[] toRotate, int index ) {
        Array.Reverse(toRotate, 0, index);
        Array.Reverse(toRotate, index, toRotate.Length-index);
        Array.Reverse(toRotate, 0, toRotate.Length);
    }

In Ihrem Beispiel würde der Index 16 sein Dieser Code behandelt ungeradee Stückzahl und den Index in der Mitte nicht zu sein. Anhand eines Beispiels ähnlich dem in dem Buch verwendet für toRotate = {0,1,2,3,4,5,6,7} und index = 3 Rotate2 erzeugen würde {3,4, 5,6,7,0,1,2}.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top