快排之單邊掃瞄和雙邊掃瞄策略

2021-10-08 10:54:50 字數 2010 閱讀 8278

在這麼多的排序演算法中,不考慮桶排序,只有堆排序、快速排序、歸併排序的時間複雜度是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...