之前在課程上對於快速排序的認知還不夠深入,雖然知道大概是每一次都把小於主元以及大於主元的元素分別排在主元的兩側,之後不斷的遞迴縮小範圍達到整體有序,但是甚至到正式學習之前都沒有辦法徒手寫出快速排序。這裡稍微整理一下。
藍橋杯備戰資料《演算法之美》 chapter3——查詢與排序(下)這裡一共提供了三種的進行分割槽的方法,就是把小於主元的元素以及大於主元的元素進行分割槽。
主元(x)+左指標(p1)+右指標(p2)
從左往右,若p1所指元素 <= x,則p1右移;
若p1所指元素 > x,則p1與p2的元素交換,p2左移,p1不動。
邊界:當p1 > p2 時,p2左邊的元素均 <= x,把x和p2所指元素交換。
/*把 arr 陣列的 begin —— end 區間內進行分割槽*/
intpartition
(int
*arr,
int begin,
int end)
else
}swap
(arr[begin]
, arr[bigger]);
// 最後把主元與右指標的內容交換
return bigger;
}void
quicksort
(int
*arr,
int begin,
int end)
}
主元(x)+左指標(p1)+右指標(p2)先從左往右,p1移到第乙個 > x 的元素;
再從右往左,p2移到第乙個 <= x 的元素;
p1和p2的元素進行交換,重複以上過程直至p1與p2交錯,進行交換。
/*把 arr 陣列的 begin —— end 區間內進行分割槽*/
intpartition
(int
*arr,
int begin,
int end)
}swap
(arr[begin]
, arr[right]);
// 最後把主元與右指標的元素交換
return right;
}void
quicksort
(int
*arr,
int begin,
int end)
}
主元(x)+左指標(p1)+右指標(p2)+「等於」指標(e)從左往右,若p1所指元素 < x,則p1與e的元素進行交換,均右移;
若p1所指元素 = x,則p1右移;
若p1所指元素 > x,則p1與p2的元素交換,p2左移,p1不動。
邊界:當p1 > p2時,e左移,x與e的元素交換。
(保證分割槽後是如下的形式)
/*把 arr 陣列的 begin —— end 區間內進行分割槽
* 其中pos1用來儲存「等於」區間的左邊界,pos2用來儲存「等於」區間的右邊界*/
void
partition
(int
*arr,
int begin,
int end,
int&pos1,
int&pos2)
else
if(arr[left]
< mid)
else
}swap
(arr[begin]
, arr[
--equal]);
// 最後將主元與「等於」指標的前乙個元素交換
pos1 = equal;
// pos1為「等於」區間的左邊界
pos2 = right;
// pos2為「等於」區間的右邊界
}void
quicksort
(int
*arr,
int begin,
int end)
}
快速排序的三種分割槽方法
快速排序運用了分治思想 分解 將陣列arr l r 劃分為兩個子陣列arr l p 1 和arr p 1 r 使得arr p 為大小居中的數,即左側arr l p 1 中的每個元素都小於等於它 而右側arr p 1 r 中的每個元素都大於等於它。其中計算下標p也是劃分過程的一部分。解決 通過遞迴呼叫...
三種快速排序
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.挖坑法 用圓圈...