在這麼多的排序演算法中,不考慮桶排序,只有堆排序、快速排序、歸併排序的時間複雜度是o(nlogn),今天就來討論一下神奇的排序演算法——快速排序
之所以說快排是個神奇的演算法,不僅僅是因為其時間複雜度較低,其中包含的幾個比較重要的思想非常值得我們學習一下
快速排序演算法包含其中乙個思想就是分治思想,這也是快排的時間複雜度能夠保持在o(nlogn)的關鍵因素
public
class
quicksort1
;sort
(a);
//partition(a,0,a.length-1);
system.out.
println
("排序後的a:"
+ arrays.
tostring
(a));}
private
static
void
sort
(int
arr)
private
static
void
sort
(int
arr,
int startindex,
int endindex)
private
static
intpartition
(int
arr,
int startindex,
int endindex)
if(arr[i]
<=pilot)
}int pre = arr[startindex]
; arr[startindex]
= arr[mark-1]
; arr[mark-1]
= pre;
return mark-1;
}}
public
class
quicksort2
;sort
(a);
system.out.
println
("排序後的a:"
+ arrays.
tostring
(a));}
private
static
void
sort
(int
arr)
//用遞迴
private
static
void
sort
(int
arr,
int startindex,
int endindex)
int pivotindex =
partition
(arr, startindex, endindex)
;sort
(arr, startindex, pivotindex -1)
;sort
(arr, pivotindex +
1, endindex);}
private
static
intpartition
(int
arr,
int startindex,
int endindex)
arr[left]
= pivot;
return left;
}}
對於單、雙邊掃瞄的演算法實現是不同的,但是有個細節,那就是選取基準值pivot
快排還有一些衍生題目,這裡簡單提一下
如何找出乙個無序陣列的中位數?
快排思路
找出乙個無序陣列中第 k 小的元素,即排序後的第 k-1 位置上的元素?
快速排序 雙邊掃瞄與單邊掃瞄的實現
快速排序 時間複雜讀o n logn 最差o n 2 平均o n logn 主要思想是選取乙個標誌位,大於標誌位的放到右邊,小於標誌位的放到左邊,在以標誌位為分割,分而制之,左遞迴,右遞迴,直到完成。快速排序的思想 雙邊掃瞄 快速排序就像乙個資料快,前後各有乙個下標 指標 i j,隨機選取 此處取下...
分治法 快排劃分法(單向掃瞄法)
一 分治法 將乙個規模較大的問題轉化為多個相同形式小規模的子問題,子問題規模較小時,可自然求解。子問題的解可通過合併得到原問題的解。舉例 小明讓小張和小李去借2000元,小張借1000,小李借1000,他們各自向朋友去借,這就是乙個分治問題 思路 用兩個指標將陣列劃分為三個區間。掃瞄指標左邊是確認小...
經典排序 第k個元素(快排和雙向掃瞄法)
一 第k個元素 以盡量高的效率求出乙個亂序陣列中按數值順序的第k個元素 亂序陣列 法一 利用快速排序,演算法時間複雜度o nlogn 法二 利用分割槽排序法 雙向掃瞄法 依次與主元比較,比主元大的排在右面不變,比主元小的指標交換位置,得到如下陣列 偽 selectk a,p,r,k partitio...