簡體   English   中英

Quicksort-遞歸

[英]Quicksort - recursive

我正在嘗試以兩種方式對quicksort進行編碼,一種是就地方式,另一種是使用單獨的數組。 我有點迷戀於某些邏輯,看看我有什么,謝謝您的幫助!

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);

}

現在我被困住了,我不知道在遞歸遍歷這兩個集合后會怎么做,主要是停留在如何將它們連接在一起並返回排序列表上。

您需要結合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循環中每個數組的長度( leftright )。

另外,我必須指出,這與quicksort無關。 如此多的new數組分配使算法極慢,並且在排序時不受歡迎。

同樣,第3行的右側是多余的。 您無需在此處分配任何內容,因為它會在下一行覆蓋。 我只需將您的3-5行替換為:

return quickSort(arr);

讓我為您解決這個問題。

首先,除非您正在使用鏈表,否則您始終要進行就地排序(即使那樣,通常也需要將其轉換為數組,進行就地排序,然后再轉換回鏈表,這很省錢)垃圾收集器上的壓力)。 .NET List <>實際上是在擴展數組。

接下來,quicksort實際上就是關於透視操作的全部內容。 這是一種實現方法:

// 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;
}

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])
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM