1

我正在尝试以两种方式对快速排序进行编码,一种是就地编码,另一种是使用单独的数组。我有点卡在一些逻辑上,看看我有什么,提前感谢您的帮助!

public List<Integer> sort(List<Integer> arr){
  if(arr.length > 0)
    List<Integer> ret = new ArrayList<Integer>();
  ret = quickSort(arr);
  return ret;
 }

public List<Integer> quickSort(List<Integer> arr){
  if(arr.length < 2)
    return;

  int pivot = arr[0];
  List<Integer> left = new ArrayList<Integer>();
  List<Integer> right = new ArrayList<Integer>();

  for(int i = 0; i < arr.length; i++){
    if(arr[i] <= pivot)
      left.add(arr[i]);
    else
      right.add(arr[i]);
  }
  quickSort(left);
  quickSort(right);

}

现在我被困住了,我不知道在递归地遍历两组之后我会做什么,主要是停留在如何将它们连接在一起并返回一个排序列表。

4

3 回答 3

1

您需要将leftright序列组合在一起。您需要在算法结束时(关闭之前})执行此操作。在伪代码中:

int leftpos = 0, rightpos = 0;
List newlist = new ArrayList();
for(int pos = 0; pos < arr.length; pos++)
  if left[pos] < right[pos] newlist.add(left[leftpos++]);
    else newlist.add(right[rightpos++]);
return newlist;

这只是一个伪代码。您需要添加代码来检查for 循环中每个数组 (left和) 的长度。right

另外我必须注意,这远非快速排序。如此多new的数组分配使算法极其缓慢,这在排序时是不受欢迎的。

此外,第 3 行的右侧是多余的。你不需要在这里分配任何东西,因为它会在下一行被覆盖。我只是简单地用这个替换你的第 3-5 行:

return quickSort(arr);
于 2012-11-28T03:08:52.093 回答
0

让我为你解决这个问题。

首先,除非您使用链表,否则您总是希望进行就地排序(即使这样,通常也需要转换为数组,就地排序,然后再转换回链表——它减少了垃圾收集器的压力)。.NET List<>s 实际上是扩展数组。

接下来,快速排序实际上是关于枢轴操作的。这是一种方法:

// Quicksort the sub-array xs[lo..hi].
void QSort(int[] xs, int lo, int hi) {
    if (hi <= lo) return; // Don't sort empty or singleton sub-arrays.
    var p = [choose some pivot value from xs[lo..hi]];
    var a = lo; // Invariant: x[lo..a - 1] <= p.
    var z = hi; // Invariant: p < x[z + 1..hi].
    while (a <= z) {
        if (xs[a] <= p) a++; else Swap(xs, a, z--);
    }
    QSort(xs, lo, a - 1); // Sort the items <= p.
    QSort(xs, z + 1, hi); // Sort the items > p.
}

void Swap(int[] xs, int i, int j) {
    var tmp = xs[i];
    xs[i] = xs[j];
    xs[j] = tmp;
}
于 2012-11-28T04:34:04.373 回答
0

Groovy 上的简单实现

def qs(list) {
  if (list.size() < 2) return list   
  def pivot = list[0]
  def items = list.groupBy { it <=> pivot }.withDefault { [] }
  qs(items[-1]) + items[0] + qs(items[1])
}
于 2015-05-12T17:52:30.490 回答