2016-04-20 59 views
0

我一直在用我的快速排序功能摔跤,但仍然不知道我做错了什么。双端队列(Deque)快速排序

当我在包含随机生成的元素[6,92,63,90,79,94,8,13,72,28]

结果是[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); 

} 

回答

0

如果我理解正确的代码,错误是在最后一部分,在那里你将结果连接。

从左边开始(数字小于数据透视表),移除它的第一个元素并将它从左边推入队列,因此它变成最右边的元素。然后你推动枢轴,然后右边部分的元素(数字大于枢轴),成为队列中最左边的元素。

例如

  • 左:[3]
  • 枢轴:[5]
  • 右:[7]

现在串联(在步骤)

  1. left - > deque [3]
  2. 枢轴(enqueueFront) - >双端队列[5,3]
  3. 右(enqueueFront) - >双端队列[7,5,3]

所以让我们假设该集合现在是左部的结果处理。现在,如果你把该组另一个不良排序[9,8]

  • 左一套更大的值(右部):[7,5,3]
  • 权:[9,8]

你得到(步骤简化的)

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

正如可以看到的,与每个递归部分排序子列表交替的顺序。导致使用部分排序片段的错误排序结果集。

TL; DR检查级联的顺序,或者使用适当的添加操作(前VS背面)