Voulez-vous simplement réorganiser les données de la matrice afin que des éléments similaires ne soient pas à côté de chacun. Les données ne doivent pas être retirées du tableau, s'il ne peut pas être réarrangé, il peut être mis à la fin de la matrice. Mais garder l'ordre d'origine est nécessaire.
Exemple p> éditer:
Exemple supplémentaire pour montrer que la commande d'origine est nécessaire p> p>
7 Réponses :
hmm. BubblesTort vous vient à l'esprit, mais avec une comparaison de trois éléments; c'est-à-dire que si élément [x] code> et élément [x + 1] code> sont identiques et élément [x + 2] code> est différent, échange élément [x + 1] code> et élément [x + 2] code>. Répétez la répétition d'itération à travers la liste jusqu'à ce qu'aucun swaps ne se produise. L'ordre d'exécution est bien sûr horrible, mais cela devrait répondre à vos besoins. P>
D'accord, qu'est-ce qui est avec le bowvote? Y a-t-il un problème avec cette approche (autre que l'ordre de temps d'exécution acquitté)?
Je n'ai pas répondu, mais cela n'est même pas garanti de se terminer.
@wnoise: ce n'est même pas pcode, juste une description simple d'un algorithme; Obtenir des conditions de résiliation appropriées en place est en quelque sorte supposée être un exercice pour le lecteur.
Remplissez votre tableau dans une classe VaR, vous pouvez ensuite exécuter vos méthodes de tri personnalisées sans le changer. Félicitations, vous venez de créer une nouvelle base de données NOSQL.
Qu'est-ce qui fait peur à tout le monde perd la commande originale. P>
} p> p>
Éléments d'échange à de petits index, même d'index avec leurs homologues antipodales supérieurs: p>
Edit: D'accord, nous devrions redéfinir les contreparties antipodales. Peut-être que celui-ci est meilleur: mélanger le premier et le troisième quartile (noté X, Y en illustration) et mélanger les deuxième et troisième quartile (indiqués U, V, W). Laissez les contreparties monter parallèlement. P>
J'aime cette réponse. C'est simple et semble avoir une bonne complexité de temps (pas pire qu'un facteur constant plus que l'algorithme de tri)
J'aime la réponse, même si cela me concerne le temps d'exécution potentiel, dans la mesure où une liste minimale différente de la condition cible entraînera le temps d'exécution maximal avec cet algorithme (en raison du tri). C'est-à-dire une liste qui correspond aux critères cibles qui a ensuite un élément ajouté à celui-ci provoquera potentiellement une grande exécution d'exécution (c'est-à-dire que cet algorithme est agnostique du degré par lequel l'entrée répond aux critères d'achèvement). Cela dit, si ce n'est pas un cas attendu, cet algorithme semble que cela fonctionne bien.
triché -> 1 1 1 1 1 1 2 code>; Swap (0, 6) -> 2 1 1 1 1 1 1 code>
Dans JavaScript, je ferais probablement:
var arr = [ 1, 1, 1, 2, 3 ];
var i = 0, len = arr.length;
while (i < len - 1) {
if (arr[i] == arr[i+1]) {
//index is equal to it's partner.
if (arr[i+2] && arr[i] == arr[i+2]) {
// 3 equal values in a row, swapping won't help. Need to recheck this index in this case.
var tmp = arr[i];
arr.splice( i, 1 );
arr.push( tmp );
} else {
// Swap the next and 2nd next index.
var tmp = arr[i+1];
arr[i+1] = arr[i+2];
arr[i+2] = tmp;
i++;
}
} else {
// this index is fine, move on.
i++;
}
}
Cela pend indéfiniment parfois, ne l'utilisez pas!
Assumer un tableau contenant des chiffres compris entre 0 et 9: Semblable au Seau Tri d'une manière
int B[10];//buckets
diff=0;//how many different digits appeared
for(i=0;i<A.length;i++)
{
x=A[i];
if(B[x]==0)
{
diff++;
}
B[x]++;
}//loaded
while(diff>=0)//now to place back to array makes an interleaving
{
for(digit=0;digit<10;digit++)
{
if(B[digit]<>0)
{
A[B[digit]+diff]=digit;
B[digit]--;
}
}
diff--;
}
Prenez l'ensemble de la matrice et analysez-le pour les doublons. Lorsque vous rencontrez des dupes, rappelez-vous où ils sont. Donc, pour quelque chose comme 2 1 2 2 * 3 3 * 3 * 4 4 * 2 2 * 5. Ceux avec des étoiles doivent être rappelés. P>
Regardez maintenant les choses "mémorisées", vous avez 2 2, 2 3 et un 4 P>
Maintenant, je trierais ces listes les plus nombreux (2 et 3 et 3) au moins nombreux (4) p>
prenez maintenant simplement le plus nombreux qui ne dupliquent pas le "front" actuel (qui serait 3 parce que 2 duplicats) et le déplacent à l'avant, puis retirez-le de votre liste. P>
Répétez jusqu'à ce que les listes soient vides. La deuxième fois que via votre liste commencera par «3» et vous aurez 2 2 a 3 et un 3 et une 4, vous mettrez donc l'un des 2's à l'avant ... P>
Si vous avez laissé (il ne peut s'agir que d'un numéro) le mettre à la fin .. p>
fait, gâteau. p>
Après avoir saisi ce que vous êtes après, voici une solution possible
partition de votre tableau p>
[1,1,1,8,8,8,2,3,3,4,1,1,1,2,2] -> [[3,1],[3,8],[1,2],[2,3],[1,4],[3,1],[2,2]]
pour chaque entrée de partition Choisissez une position "Code" valide " Décrément ou laissez-le sortir s'il n'y a pas de ce poste de ce type. P> li>
ol> Ceci devrait avoir une complexité de temps linéaire (des positions valides du livre pour chaque numéro). P> P> i code> avec p [i] [0]> 1 code> (fois> 1): P>
j code> (donc p [j] [1]! = p [i] [1] && p [j + 1] [1 ]! = p [i] [1] code>) p> li>
p [i] [0] code> élément et insert [p [i] [1], 1] code> en partition à la position J P > li>
ul>
Vous voulez les réorganiser, mais gardez la commande ....?
@Mark - Les deux sont mutuellement exclusifs. Vous gardez la commande ou changez-le ... Pouvez-vous clarifier ce que vous voulez dire?
Au lieu de marquer n'importe quel langage de programmation que vous avez pensé que vous auriez pu et auriez dû le marquer avec une étiquette d'algorithme
Cela ressemble vraiment à une question de devoirs - vous pourriez mentionner que dans la question si c'est - cela aidera les gens à le répondre correctement.
@Armen mentionné les langues ne sont pas un langage de programmation, ils ont une syntaxe similaire. C'est pourquoi je les ai mentionnés.
Ceci est bien plus dur qu'il n'y paraît! Qu'en est-il des tableaux
8 2 2 2 2 2 code> ou2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 CODE>? ...;)@Mark K Vous avez donc piqué ma curiosité .. Qu'est-ce que cela pourrait être utilisé? Cela doit presque être une question de puzzle / d'entretien, mais je vous crois que cela semble un peu difficile pour les devoirs.
Vous avez évidemment quelque chose en tête par «Garder l'ordre d'origine», mais cela ne peut pas vraiment dire ce qu'il dit, car vous demandez une réorganisation. Jusqu'à ce que vous clarifiez cela, personne ne peut vraiment vous aider.
BTW, 8 2 2 2 2 7 2 5 2 => 8 2 7 2 5 2 2 peut être fait sous forme de 2 8 2 7 2 5 2, sans aucun 2 à côté de l'autre.
Je suis d'accord avec @wnoise - vous devez définir de manière rigoureuse ce que vous entendez par "Garder l'ordre original".