2009-12-06 8 views
0

Après this was answered J'ai continué à travailler dans le code. Il est parfait travail de cette façon:Tri croissant ou décroissant à l'intérieur d'un tri par bulles

static String[][] bubbleSort(String customerdata[][], int sortafter, int asc) 
{ 
    String temp []; 
    boolean sort; 

     do{ 
      sortiert = true; 

      for (int i = 0 ; i < customerdata.length - 1; i++){ 
       if(customerdata[i][sortafter].compareTo(customerdata[i+1][sortafter]) < 0){ 
        temp = customerdata[i]; 
        customerdata[i] = customerdata[i+1]; 
        customerdata[i+1] = temp; 

        sort = false; 
       } 
      } 

     }while(!sort); 

    return customerdata; 
} 

Mais comme vous pouvez le voir, je manque int asc dans cette fonction. Ce que je veux, c'est ajouter un tableau descendant ou croissant trié (selon asc == 1 (asc), ou asc == 0 (desc)).

Je ne sais pas comment l'implémenter à l'intérieur. Je veux dire en ce moment je peux le trier ascendant ou descendant, mais une fois APRÈS cette méthode a été appelée avec de longues boucles for for() et if().

Je voudrais l'avoir de manière compacte à l'intérieur et en fonction du fait que je donne des bulles (x, 0,0) ou (x, 0,1) la liste devrait être retournée en ordre croissant ou décroissant.

+0

ajouter le tag devoirs, ou quitter la programmation.Le tri des bulles n'est pas quelque chose de sérieux, sauf pour les expériences scolaires – Bozho

+0

Ce n'est pas nécessairement les devoirs, il pourrait être autodidacte. En outre, il n'y a que de la place pour 5 tags. Nous savons tous que bubbleort est terrible, maintenant essayons d'apprendre quelque chose de toute façon! –

+0

Quel est votre problème Bozho? Laissez-moi deviner, vous êtes né un pro-grammer? –

Répondre

1

Trié par ordre croissant signifie que l'élément i est inférieur à l'élément i + 1. Par ordre décroissant, l'élément i est supérieur à l'élément i +. L'astuce consiste à retourner la logique où vous décidez si les éléments sont hors de propos. Plus précisément, cette ligne:

if(customerdata[i][sortafter].compareTo(customerdata[i+1][sortafter]) < 0){ 

devrait être modifiée pour

if(customerdata[i][sortafter].compareTo(customerdata[i+1][sortafter]) > 0){ 

si vous voulez retourner l'ordre du tri.

+0

il demande comment il peut ajouter cela dans le code, conditionnellement du paramètre ... Il sait déjà comment changer le tri – Toad

+0

Oui, eh bien, cela a répondu à ma question. Peut être résolu avec if (asc == 0) et à l'intérieur de la boucle do. Efficace? Pas vraiment. Travaux? Hé ouais! –

1

Vous pouvez toujours trier par ordre croissant et l'inverser simplement si vous souhaitez descendre. Il s'agit de savoir si répéter le test "if" à l'intérieur de la boucle est moins efficace qu'une autre traversée du tableau.

Je suppose que la taille de la matrice est relativement petite. Le tri par bulles est notoirement inefficace et ne devrait pas être utilisé à l'exception de petits réseaux.

+0

Oui, je suis conscient de l'inefficacité de la fonctionnalité de "bubblesort", mais j'apprends toujours Java et ce n'est pas mon habitude de passer à côté de quelques chapitres juste parce qu'ils sont inefficaces. De toute façon, je veux comprendre comment cela fonctionne. –

+0

Juste pour le compte rendu, je pense que même avec BubbleSort, votre code est moins horrible qu'un code "professionnel" que j'ai vu sur la table d'opération ici :) Je vous demanderais, cependant, de remplacer les onglets principaux par (disons) 2 espaces pour une lecture plus facile. –

1

essayez ceci:

for (int i = 0 ; i < customerdata.length - 1; i++){ 
     if(customerdata[i+asc][sortafter].compareTo(customerdata[i+1-asc][sortafter]) < 0){ 
      temp = customerdata[i]; 
      customerdata[i] = customerdata[i+1]; 
      customerdata[i+1] = temp; 

      sort = false; 
     } 
} 

Asc peut être 0 ou 1 (ascendant ou descendant ...)

en l'ajoutant à votre index, vous permutez essentiellement l'instruction if, sans ajouter une autre si ; ^)

(note il y a 2 positions que je changé: le "+ asc" et "- asc")

EDIT: ne pas oublier de mettre un grand assert à la première ligne s'assurant que Asc ne peut vraiment pas être autre chose que 0 ou 1; ^)

+0

Oui, asert serait une bonne idée, aussi les exceptions essaient n attraper aussi. Si un utilisateur doit taper quelque chose d'autre à part 0 ou 1. –

1

Et si vous voulez la réponse de type "génie logiciel" au lieu de la réponse rapide que j'ai donnée ci-dessus, vous pouvez passer un foncteur (recherchez la classe Comparator) pour faire la comparaison, pour permettre une recherche ultimement flexible.

2

solution simple: Pouvez-vous faire asc dans l'une des 1 ou -1?

alors vous devez seulement changer une ligne:

if(asc * customerdata[i][sortafter].compareTo(customerdata[i+1][sortafter]) < 0) 
+0

Maintenant, c'est la façon la plus simple I. Merci! –