2017-02-10 7 views
2

Sortierung zusammenführen, sortieren, indem ein zufälliges Array in zwei Hälften geteilt und dann in numerischer Reihenfolge platziert wird. Das Konzept heißt "Teile und herrsche". Die Ausgabe ist außer Betrieb und ich sehe nichts falsch mit diesem Code. Main gibt nur alle Zahlen im Array aus. Zu Ihrer Information, andere Teile des Codes sind nicht das Problem. Aber wenn du es brauchst, kann ich es dir geben.In Java mit "Divide and Conquer" sortieren

private void merge(int[] a, int first, int mid, int last) 
{ 
    int size = last - first + 1; 
    int [] temp = new int[size]; 
    int i = first, j = mid + 1; 
    for(int s = 0; s < size; s++){ // a.length 
     if(i > mid){ // case a 
      temp[s] = a[j]; 
      j++; 
     }else if(j > last){ // case b 
      temp[s] = a[i]; 
      i++; 
     }else if(a[i] < a[j]){ // case c 
      temp[s] = a[i]; 
      i++; 
     }else if(a[j] <= a[i]){ // case d 
      temp[s] = a[j]; 
      j++; 
     } 
    } 

    for(int s = first; s < size; s++){ 
     a[first] = temp[s - first]; 
    } 
} 

public void mergeSort(int[] a, int first, int last) 
{ 
    int size = last - first + 1, mid; 
    if(size == 1){ 
     steps++; 
    }else if(size == 2){ 
     if(a[last] > a[first]){ 
      int temp = a[last]; 
      a[last] = a[first]; 
      a[first] = temp; 
      steps += 3; 
     } 
    }else{ 
     mid = (last + first)/2; 
     mergeSort(a, first, mid); 
     mergeSort(a, mid + 1, last); 
     merge(a, first, mid, last); 
     steps += 4; 
    } 
} 

Dies ist, was der Generator wie folgt aussieht:

private void fillArray(int numInts, int largestInt) 
{ 
    myArray = new int[numInts]; 
    Random randGen = new Random(); 

    for(int loop = 0; loop < myArray.length; loop++){ 
     myArray[loop] = randGen.nextInt(largestInt) + 1; 
    } 
} 
+2

Haben Sie versucht, einen Debugger zu verwenden? Sie werden sich bei solchen Fragen nicht immer auf SO verlassen können. –

+0

@TimBiegeleisen Ja, ich habe einen Debugger benutzt. –

+0

@StackOver - warum nicht die ifs ändern und von [] nach temp [] in merge() kopieren, um in der gewünschten Reihenfolge in temp zu sortieren, dann ändere die for-Schleife, um 'a [s] = temp [s] zu verwenden ; '? Der Code in mergesort() sortiert ein Unterarray der Größe 2 in absteigender Reihenfolge, während der Code in der Zusammenführung scheinbar in aufsteigender Reihenfolge sortiert wird. Sie müssen sie gleich machen (aufsteigend oder absteigend). – rcgldr

Antwort

1

gibt zwei Fehler im Code sind:

zuerst:

for(int s = first; s - first < size; s++){// replace s<size with s-first<size 
     a[s] = temp[s - first];//yours a[first] = temp[s-first] 
} 

in Ihrer Codierung, ist zunächst behoben und es wird immer die a [erste] aktualisieren, die ich denke nicht, was du bist wollen.

Sekunden:

.... 
}else if(a[i] > a[j]){ // case c yours a[i]<a[j] 
      temp[s] = a[i]; 
      i++; 
}else if(a[i] <= a[j]){ // case d yours a[j] <= a[i] 
      temp[s] = a[j]; 
      j++; 
} 
.... 

weil über Ihre Art erhalten Sie eine absteigen Sequenz und in merge möchten Sie ascend um, diesen Konflikt miteinander kommen.

+0

Dies zu tun, gibt mir das gleiche Problem. Es setzt das zufällige Array nicht in numerischer Reihenfolge. Aber danke. –

+0

@Stack Over Ich habe es für Sie repariert, und es kann das zufällige Array in numerischer Reihenfolge setzen. Der Kommentar ist dein Code und ich habe sie behoben. –

+0

Ich habe es versucht. Es funktioniert nicht. –

Verwandte Themen