2015-03-27 25 views
5

Sono uno studente di programmazione e anziché postare l'intero compito, chiedo semplicemente aiuto per risolvere ciò che ho provato per ore a capire. Ho il compito di ordinare una serie di stringhe usando il metodo quicksort. Tutto il resto che ho ricevuto come parte di questo problema va bene, ma quando ho provato il metodo di ordinamento stampando la matrice di stringhe, è completamente confuso senza alcuna rima o ragione apparente. Per favore aiutami a individuare l'errore nel mio codice, o i numerosi errori di abbagliamento che ho trascurato. L'array di stringhe di cui è questa lista di 65 nomi: http://pastebin.com/jRrgeV1E e il codice del metodo è qui sotto:Utilizzo di quicksort su un array di stringhe

private static void quickSort(String[] a, int start, int end) 
{ 
     // index for the "left-to-right scan" 
     int i = start; 
     // index for the "right-to-left scan" 
     int j = end; 

     // only examine arrays of 2 or more elements. 
     if (j - i >= 1) 
     { 
      // The pivot point of the sort method is arbitrarily set to the first element int the array. 
      String pivot = a[i]; 
      // only scan between the two indexes, until they meet. 
      while (j > i) 
      { 
       // from the left, if the current element is lexicographically less than the (original) 
       // first element in the String array, move on. Stop advancing the counter when we reach 
       // the right or an element that is lexicographically greater than the pivot String. 
       while (a[i].compareTo(pivot) < 0 && i <= end && j > i){ 
        i++; 
       } 
       // from the right, if the current element is lexicographically greater than the (original) 
       // first element in the String array, move on. Stop advancing the counter when we reach 
       // the left or an element that is lexicographically less than the pivot String. 
       while (a[j].compareTo(pivot) > 0 && j >= start && j >= i){ 
        j--; 
       } 
       // check the two elements in the center, the last comparison before the scans cross. 
       if (j > i) 
        swap(a, i, j); 
      } 
      // At this point, the two scans have crossed each other in the center of the array and stop. 
      // The left partition and right partition contain the right groups of numbers but are not 
      // sorted themselves. The following recursive code sorts the left and right partitions. 

      // Swap the pivot point with the last element of the left partition. 
      swap(a, start, j); 
      // sort left partition 
      quickSort(a, start, j - 1); 
      // sort right partition 
      quickSort(a, j + 1, end); 
     } 
    } 
    /** 
    * This method facilitates the quickSort method's need to swap two elements, Towers of Hanoi style. 
    */ 
    private static void swap(String[] a, int i, int j) 
    { 
    String temp = a[i]; 
    a[i] = a[j]; 
    a[j] = temp; 
    } 
+0

Qual è il tuo problema esatto? Non è così. Mostra valori più volte, dal momento che l'ho provato e sembra funzionare bene – SomeJavaGuy

+0

Ha funzionato per te ?? Forse dovrei pubblicare il resto del mio codice allora ... Mostra questo ordine per me quando lo stampo dopo "l'ordinamento": http://pastebin.com/5969hxGs è così strano! – Mackenzie

risposta

5

Ok, mi sono sbagliato che avrebbe funzionato e trovato il vostro piccolo errore.

Date un'occhiata a wikipedias pseudo code

Si noterà che le vostre condizioni nel ciclo while stanno causando l'errore

se si cambia (a[i].compareTo(pivot) < 0 && i <= end && j > i) e (a[j].compareTo(pivot) > 0 && j >= start && j >= i) a

(a[i].compareTo(pivot) <= 0 && i < end && j > i) e (a[j].compareTo(pivot) >= 0 && j > start && j >= i).

+1

Grazie mille! Funziona anche per me adesso, e vedo che è stato solo semplice da uno degli errori che sono stati la mia rovina. Grazie mille, ora posso stare tranquillo! – Mackenzie

0

Pensato che questo sarebbe di aiuto per coloro che cercano un algoritmo di ordinamento delle stringhe basato sul metodo di ordinamento rapido.

public class StringQuickSort { 

    String names[]; 
    int length; 

    public static void main(String[] args) { 
     StringQuickSort sorter = new StringQuickSort(); 
     String words[] = {"zz", "aa", "cc", "hh", "bb", "ee", "ll"}; // the strings need to be sorted are put inside this array 
     sorter.sort(words); 

     for (String i : words) { 
      System.out.print(i); 
      System.out.print(" "); 
     } 
    } 

    void sort(String array[]) { 
     if (array == null || array.length == 0) { 
      return; 
     } 
     this.names = array; 
     this.length = array.length; 
     quickSort(0, length - 1); 
    } 

    void quickSort(int lowerIndex, int higherIndex) { 
     int i = lowerIndex; 
     int j = higherIndex; 
     String pivot = this.names[lowerIndex + (higherIndex - lowerIndex)/2]; 

     while (i <= j) { 
      while (this.names[i].compareToIgnoreCase(pivot) < 0) { 
       i++; 
      } 

      while (this.names[j].compareToIgnoreCase(pivot) > 0) { 
       j--; 
      } 

      if (i <= j) { 
       exchangeNames(i, j); 
       i++; 
       j--; 
      } 
     } 
     //call quickSort recursively 
     if (lowerIndex < j) { 
      quickSort(lowerIndex, j); 
     } 
     if (i < higherIndex) { 
      quickSort(i, higherIndex); 
     } 
    } 

    void exchangeNames(int i, int j) { 
     String temp = this.names[i]; 
     this.names[i] = this.names[j]; 
     this.names[j] = temp; 
    } 
}