快速排序的三種分割槽方法

2022-02-20 05:03:09 字數 1838 閱讀 9676

**:

快速排序運用了分治思想

分解:將陣列arr[ l…r ]劃分為兩個子陣列arr[ l…p-1 ]和arr[ p+1…r ]。使得arr[ p ]為大小居中的數,即左側arr[ l…p-1 ]中的每個元素都小於等於它;而右側arr[ p+1…r ]中的每個元素都大於等於它。其中計算下標p也是劃分過程的一部分。

解決:通過遞迴呼叫快速排序,對子陣列arr[ l…p-1 ]和arr[ p+1…r ]進行排序。

合併:因為子陣列都是原址排序的,所以不需要合併。即a[ l…r ]已經有序。

快排的重點在於劃分區域:將小於中間值的元素全放在左邊,大於中間值的元素放在右邊

① 單向掃瞄分割槽法

② 雙向掃瞄分割槽法

③ 三指標掃瞄分割槽法

分割槽方法:

int single_portion(int arr, int l, int r)

① 定義陣列第乙個元素為主元

② 定義左指標指向陣列第二個元素,右指標指向陣列最後乙個元素(最終目的是使左指標左側都是小於等於主元的元素,右指標右側都是大於主元的元素)

③ 判斷左指標所指元素是否小於等於主元

1.若小於等於主元:左指標右移一位

2.若大於主元:將左指標所指元素與右指標所指元素交換位置,且右指標左移一位

④ 直到左指標超過右指標,此時左指標指向大於主元的第乙個元素,右指標指向小於等於主元的最後乙個元素

⑤ 將主元與右指標所指元素交換位置,此時即分割槽完畢,形成主元左側元素小於等於主元,主元右側元素大於主元

快速排序方法(遞迴實現):

void single_quicksort(int arr, int l, int r)

① 呼叫分割槽方法portion(),獲取主元位置

② 將主元左側與右側分別進行快速排序,即實現了陣列的排序

**:分割槽方法概述(大部分與單向掃瞄法類似,不再贅述):

int double_portion(int arr, int l, int r)

① 與單向掃瞄分割槽法大體類似,區別在於:雙向掃瞄分割槽法的左指標與右指標同時掃瞄

② 左指標往右掃瞄,直到遇到第乙個大於主元的元素停下;右指標往左掃瞄,知道遇到第乙個小於等於主元的元素停下

③ 將兩指標所指元素交換位置後,兩指標繼續掃瞄重複②

快速排序函式:與單向掃瞄分割槽法相同

分割槽方法概述:

int tri_portion(int arr, int l, int r)

① 如果陣列中存在很多與主元等值的元素,那麼在對主元左、右側進行快速排序時,可以不用對那些與主元等值的元素進行排序

② 增設乙個等值指標,來標記第乙個與主元相等的元素,最終將區域劃分為三部分:

1.左側為所有小於主元的元素

2.中間為所有等於主元的元素

3.右側為所有大於主元的元素

快速排序方法概述:

void tri_quicksort(int arr, int l, int r)

① 將第乙個等於主元的元素的左側進行快排,將最後乙個等於主元的元素的右側進行快排

快速排序的三種分割槽方法(整理)

之前在課程上對於快速排序的認知還不夠深入,雖然知道大概是每一次都把小於主元以及大於主元的元素分別排在主元的兩側,之後不斷的遞迴縮小範圍達到整體有序,但是甚至到正式學習之前都沒有辦法徒手寫出快速排序。這裡稍微整理一下。藍橋杯備戰資料 演算法之美 chapter3 查詢與排序 下 這裡一共提供了三種的進...

三種快速排序

3種快排的實現方式,1是不適合重複元素多,2可以適應重複元素多,3可以優化重複元素多的時間 author hxj 2020年7月27日 public class main int l 0,r arr.length 1 quicksort arr,l,r private static void qui...

快速排序的三種方法(遞迴)

快排 一.確定基準值有3種 選最左或者最右的那個數作為基準值 三數取中法 就是取left,mid和right三個數中中間的那個數作為基準值 取隨機值作為基基準值 二.將陣列分為兩部分比基準值小的放在左邊,比基準值大的放在右邊 1.hover法 b就是下面 的begin e是end 2.挖坑法 用圓圈...