2016-04-20 9 views
0

Ich habe ein bisschen mit meiner Quicksort-Funktion gerungen, habe aber immer noch keine Ahnung, was ich falsch mache.Doppelte Warteschlange (Deque) Quicksort

Wenn ich laufen quicksort auf einem zufällig erzeugten Deque Elemente enthalten [6,92,63,90,79,94,8,13,72,28]

Das Resultat ist [13,8,28, 94,92,63,72,90,79,6]

public class DoublyLinkedDeque<E extends Comparable<E>> implements DequeADT<E> 
{ 
    ... 

    public void quickSort(DoublyLinkedDeque<E> deque, Comparator<E> comp) 
    { 
     int n = deque.size(); 
     if (n < 2) 
     { 
      return; 
     } 
     // using first as arbitrary pivot 
     E pivot = deque.first();      
     DoublyLinkedDeque<E> left = new DoublyLinkedDeque<>(); 
     DoublyLinkedDeque<E> equalsPivot = new DoublyLinkedDeque<>(); 
     DoublyLinkedDeque<E> right = new DoublyLinkedDeque<>(); 
     while (!deque.isEmpty()) 
     { 
      // divide original into left, equalsPivot, and right 
      E element = deque.dequeueFront(); 
      int tmpCompare = comp.compare(element, pivot); 
      // element is less than pivot 
      if (tmpCompare < 0)        
      { 
       left.enqueueFront(element); 
      } 
      // element is equal to pivot 
      else if (tmpCompare == 0)      
      { 
       equalsPivot.enqueueFront(element); 
      } 
      // element is greater than pivot 
      else         
      { 
       right.enqueueFront(element); 
      } 
     } 
     // sort elements less than pivot 
     quickSort(left, comp);      
     // sort elements greater than pivot 
     quickSort(right, comp);      
     // concatenate results 
     while (!left.isEmpty()) 
     { 
      deque.enqueueFront(left.dequeueFront()); 
     } 
     while (!equalsPivot.isEmpty()) 
     { 
      deque.enqueueFront(equalsPivot.dequeueFront()); 
     } 
     while (!right.isEmpty()) 
     { 
      deque.enqueueFront(right.dequeueFront()); 
     } 
    } 
} 


public static void main(String[] args) 
{   

    DoublyLinkedDeque<Integer> deque = new DoublyLinkedDeque<Integer>(); 

    /* ADDING RANDOM NUMBER TO deque */ 

    Comparator<Integer> intComparator = new Comparator<Integer>() 
    { 
     @Override 
     public int compare(Integer i1, Integer i2) 
     { 
      return (i1 < i2 ? -1 : i1 > i2 ? +1 : 0); 
     } 
    }; 

    deque.quickSort(deque, intComparator); 

} 

Antwort

0

Wenn ich Ihren Code richtig verstanden hat, ist der Fehler im letzten Teil, wo Sie die Ergebnisse verketten.

Sie beginnen mit dem linken Teil (Zahlen kleiner als Pivot), entfernen das erste Element und schieben es von links in die Queue, so dass es das rechte Element wird. Dann drücken Sie den Drehpunkt und dann die Elemente des rechten Teils (Zahlen größer als Drehpunkt) und werden so zu den am weitesten links liegenden Elementen in der Warteschlange.

Zum Beispiel

  • links: [3]
  • Schwenk: [5]
  • rechts: [7]

verketten Now (in Stufen)

  1. links -> deque [3]
  2. Pivot (enqueueFront) -> deque [5,3]
  3. rechts (enqueueFront) -> deque [7.5.3]

So dieser Satz lässt vermuten, ist nun das Ergebnis eines linken Teil wird bearbeitet. Nun, wenn Sie kombinieren diesen Satz mit einem anderen schlecht sortierte Satz von größeren Werten (ein rechter Teil) von [9,8]

  • links: [7.5.3]
  • rechts: [9,8]

Sie erhalten (Schritte vereinfacht)

  1. [7]
  2. [5,7]
  3. [3,5,7]
  4. [9,3,5,7]
  5. [8,9,3,5,7]

Wie zu sehen war, die Reihenfolge der teilweise sortiert Sublisten wechselt mit jeder Rekursion. Ergebnis in einer schlecht sortierten Ergebnismenge mit teilweise sortierten Fragmenten.

TL; DR Prüfung der Reihenfolge der Verkettung oder verwenden, um eine korrekte Additionsoperation (front vs back)