2017-09-13 1 views
0

J'ai travaillé dessus toute la journée et je ne sais pas pourquoi cela ne fonctionne pas. Le tri est en train de dupliquer certains éléments et de trier certains éléments du tableau, mais je ne vois pas ce qui en est la cause. Je ai essayé de le tracer, mais je ne pouvais pas le suivre.Fusionner Trier en Java ne fonctionne pas comme prévu. Essayer de le faire sans boucle while

import java.io.FileNotFoundException; 
import java.util.Arrays; 
public class Main { 
    public static void main(String[] args) throws FileNotFoundException { 

     int[] array = new int[10]; 
     for(int i = 0; i < array.length; i++) { 
      array[i] = (int) (Math.random()*5); 
     } 

     int[] temp = array.clone(); 
     int l = 0; 
     int r = array.length-1; 
     System.out.println("unsorted "+Arrays.toString(array)); 
     mergeSort(array, temp, l, r); 
     System.out.println("sorted "+Arrays.toString(array)); 
    } 

    public static void mergeSort(int[] array, int[] temp, int p, int r) { 
     int q = (p + r)/2; 
     if(p < r) { 
      mergeSort(array, temp, p, q); 
      mergeSort(array, temp, q+1, r); 
      merge(array, temp, p, q, r); 
     } 
    } 

    public static void merge(int[] array, int[] temp, int p, int q, int r) { 


     int i = p; 
     int j = q + 1; 

     for(int k = p; k < r; k++){ 
     if(i > q){ 
      array[k] = temp[j]; 
      j++; 
     } else if(j > r) { 
      array[k] = temp[i]; 
      i++; 
     } 
     else if(temp[j] < temp[i]) { 
      array[k] = temp[j]; 
      j++; 
     } else { 
      array[k] = temp[i]; 
      i++; 
     } 
     } 
    } 
} 
+2

« questions visant à obtenir l'aide de débogage (» pourquoi est-ce pas le code de travail ») doit comprendre le comportement souhaité, un problème spécifique ou d'une erreur et le code le plus court nécessaire pour reproduire dans la question elle-même. Les questions sans énoncé de problème clair ne sont pas utiles aux autres lecteurs. Voir: [MCVE] " – pvg

+0

Notez que l'étape de copie peut être évitée en changeant la direction de fusion en fonction de la passe pour bottom up, ou du niveau de récursion pour top down.Pour top down une paire de fonctions mutuellement récursives peut être utilisée pour changez la direction de la fusion. [Exemples du thread précédent] (https://stackoverflow.com/questions/46106922/mergesort-algorithm-whats-the-better-implementation-in-java/46107386#46107386) – rcgldr

Répondre

3

Votre code a deux problèmes:

  1. Votre boucle for doit être compris r car il est le dernier indice:

    for(int k = p; k <= r; k++) 
    
  2. Vous devez retransférer sur temp à la fin de votre opération de fusion:

    for (int k = p; k <= r; k++) { 
        temp[ k ] = array[ k ]; 
    } 
    

    ou:

    System.arraycopy(array, p, temp, p, r + 1 - p); 
    
+0

Oui, c'est mais, de la façon dont le code est écrit, la copie doit être faite avant la boucle principale, car l'identifiant de fusion est fait de 'temp' à' array' (et c'est probablement une bonne idée de réécrire le code pour utiliser des bornes inférieures inclusives et les limites supérieures exclusives, comme d'habitude en Java.) –

+0

Oui, il pourrait faire la copie au début de l'opération de fusion au lieu de cloner le tableau en premier. – alirabiee