快速排序的劃分方法 5種

2021-10-11 18:57:41 字數 1404 閱讀 5140

快速排序的劃分方法(5種)

自己做的筆記,來自看過的部落格和刷題的時候的發現。

劃分的方法

對於元素進行比較,只有三種結果 >/=/<

所以我們可以假設是紅色

陣列劃分完之後應該是 藍/藍白+pivot+紅/紅白

1、單指標從左向右掃瞄跳過 藍白

最終劃分結果: 藍白混合+pivot+紅

int partition(vector& arr, int l, int r) 

}swap(arr[pivot_pos], arr[r]);  // 退出迴圈時最後把pivot與r交換,此時l與r交錯,l指向右部分第一元素,r指向左部分最後元素

return r;//返回當前pivot位置

}void quicksort(vector& arr, int begin, int end)

}swap(arr[r], arr[pivot_pos]);  // 最後把主元與右指標的元素交換

return r;

}void quicksort(vector& arr, int begin, int end)

}

注:可以試試  【藍白混合+pivot+紅】  或【藍+pivot+紅白混合】

4、抽位填充(雙指標變種)

最終劃分結果: 藍白混合+pivot+紅白混合

int quicksort(vector&arr, int l, int r) 

arr[l] = temp;

return l;

}

可以試試  【藍白混合+pivot+紅】  或【藍+pivot+紅白混合】

5、三指標(唯一乙個 藍白紅三段分明)

最終劃分結果: 藍+白+紅

注:白色部分含pivot,位置隨意,因為函式不需要返回pivot,只需返回白色部分的第乙個和最後乙個元素

void partition(vector& arr, int l, int r, int &equal_begin, int &equal_end) //注意不需要返回pivot位置了

else if (arr[l] < pivot)

else

}//退出迴圈後l指向 由於l跳過白色元素,所以l會指向白色部分最後乙個元素的下乙個,即紅色部分第乙個

//r與l交錯,指向白色部分最後乙個

//equal指向白色部分第乙個

equal_begin = equal;  // equal 指向 白色部分第乙個元素

equal_end = l-1;  // r/l-1 指向 白色部分最後乙個元素

}void quicksort(vector&arr, int begin, int end)

}

快速排序的最早劃分方法 Hoare劃分

快速排序的劃分過程最早由c.r.hoare設計,偽 如下 hoare partition a,p,r x a p i p 1 j r 1 while true repeat j j 1 until a j x repeat i i 1 until a i x ifi j exchange a i w...

劃分 快速排序

很簡單。就不解釋了。就說說自己寫 時遇到的問題吧。無辜的總有乙個0值,插入到 左邊 12 10 3 198 120 8 54 7 12 10 3 0 0 8 54 7 只因為,陣列長度是10,但是只有8個資料,所以就有2個陣列元素為0 package high public class partin...

排序 快速排序 另一種取劃分點的方法

最基本的劃分點由陣列的最後乙個值來確定,現在是將陣列的最後乙個值的前乙個數值作為劃分點,但是需要經過三項取一方法的變換,最後它位置上的值是三個中最大的。public class arrayins public void insert long value public intsize public ...