Question

J'ai un tableau de n = 32 éléments avec des valeurs positives et négatives.Les premiers éléments n/2 sont positifs et triés par valeur et les seconds éléments n/2 sont négatifs et également triés par valeur.Je voudrais trier l'ensemble du tableau par valeur, en commençant par la plus petite valeur négative jusqu'à la plus grande valeur positive, ce qui signifie que s'il y a 32 éléments, les 16 premiers (n/2) éléments triés doivent contenir les valeurs des 16 seconds éléments du tableau d'origine. et les 16 seconds éléments du tableau trié doivent contenir les 16 premières valeurs du tableau d'origine.

Exemple hypothétique :

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};

Est-ce que quelqu'un sait quelle est la meilleure façon de déplacer les éléments pour générer le tableau trié à partir de l'original ?

Ce tableau est d'ailleurs lié à un autre tableau dont les éléments ne sont pas triés par taille de la même manière et doit être décalé de la même manière que l'original afin que le tableau ne soit pas trié par taille, il faut le déplacer.

Était-ce utile?

La solution

Vous voulez donc un deuxième tableau, avec le contenu de l'original mais à des emplacements décalés ?Soit vous le faites explicitement :

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

ou en utilisant Array.Copy deux fois:

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

Autres conseils

Étant donné la nature rigide du problème, Array.Copy:

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

Et dans Linq :

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

As-tu essayé:

Array.Sort(original);

Faites simplement un échange sur l'élément 0 et l'élément 16, 1 et 17, 2 et 18.etc.

Voulez-vous trier un tableau en fonction des valeurs contenues dans un autre tableau de même taille ?Si tel est le cas, utilisez ce qui suit :

Array.Sort(keys, values);

Voici la documentation Array.Sort (clés du tableau, éléments du tableau)

Les réponses de Jon Skeet et Marc Gravell♦ fournissent la bonne solution, mais si vous ne souhaitez pas allouer de tableau supplémentaire, vous pouvez :

a) résoudre votre problème spécifique (décaler la 2ème mi-temps avant la 1ère mi-temps) en place :

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;
        }
    }

Notez que ce code ne peut pas gérer un tableau comportant un nombre impair d’éléments.

b) vous pouvez appliquer l'algorithme de décalage vectoriel que je connais dans "Programming Pearls" de Jon Bentley :

 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);
    }

Dans votre exemple, l'index serait 16.Ce code gère un nombre impair d'éléments et l'index n'est pas au milieu.En utilisant un exemple similaire à celui utilisé dans le livre pour toRotate={0,1,2,3,4,5,6,7} et index = 3 Rotation2 produirait {3,4,5,6,7,0,1,2}.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top