排序 快速排序

2021-10-07 03:22:32 字數 1659 閱讀 1259

public

class

quick

private

static boolean less

(comparable v,comparable w)

private

static

void

exch

(comparable[

] a,int vindex,int windex)

// 分割槽

private

static int partition

(comparable[

] a,int lo,int hi)

exch

(a,lo,j)

;// 放回中間那麼,左邊都是小於該值的,右邊都是大於該值的

return j;

// 中間值

}private

static

void

sort

(comparable[

] a,int lo,int hi)

public

static

void

sort

(comparable[

] a)

}

實現策略

對陣列進行切分,從左到右找到第乙個大於切分值的元素,從右往左找到第乙個小於切分值的元素,進行交換,lo與hi指標相遇時退出迴圈交換切分值和相遇指標元素,如此切分值左邊都是小於切分值的元素,切分值右邊都是大於切分值的元素。

分析快速排序與歸併排序互補,都是分治思想的體現,歸併排序先進行排序後進行歸併,快速排序先進行切分後進行排序。快速排序的最好情況是每次切分過後切分值都剛好落在中間,最壞情況是每次切分後有一邊陣列總是為空(切分每次剛好是最值),那麼交換次數為1+2+…n-1+n~n²/2。儘管快速排序最差情況下為平方級別,比歸併排序差,但是大量的工作證明快速排序執行時間在最差情況下的機率較小,並且我們仍然可以進行一些優化工作,減少這種情況發生的概率。總的來說快速排序的執行時間為1.39nlgn的某個常數因子下(同歸並排序,但是移動次數是小於歸併排序的)。

增長數量級

最差:n2(概率較小)

最好:n(三向切分)

平均:nlgn

改進小陣列使用插入排序

對於大量重複的陣列可以使用三向切分的快速排序

三向切分的快速排序

三向切分的快速排序維護三個指標,小值上限lt,索引i,大值下限gt,

// 三向切分,維護三個指標 

public

static

void

sort3way

(comparable[

] a,int lo,int hi)

sort3way

(a,lo,lt-1)

;// 排序左邊

sort3way

(a,gt+

1,hi)

;// 排序右邊

}

切分過後lo~lt-1小於切分支lt~gt等於切分值gt+1~hi大於切分值

動態示意圖

排序 快速排序

快速排序時實踐中最快的一直排序,平均時間是0 nlogn 最壞的情況是o n2 但是很容易將這種情況避免 空間複雜度 o n lgn 不穩定。快速排序時基於分治模式處理的,對乙個典型子陣列a p.r 排序的分治過程為三個步驟 1.分解 a p.r 被劃分為倆個 可能空 的子陣列a p q 1 和a ...

排序 快速排序

定義 在快速排序演算法中,使用了分治策略,將要排序的序列分成兩個子串行,然後遞迴地對子序列進行排序,直到整個序列排序完畢。步驟 1.在序列中選擇乙個關鍵元素作為軸 2.對序列進行重新排序,將比軸小的元素移到軸的前邊,比軸大的元素移動到軸的後面。在進行劃分之後,軸便在它最終的位置上 3.遞迴地對兩個子...

排序 快速排序

時間複雜度 快速排序每次將待排序陣列分為兩個部分 1 在理想狀況下,每一次都將待排序陣列劃分成等長兩個部分,則需要logn次劃分。2 在最壞情況下,即陣列已經有序或大致有序的情況下,每次劃分只能減少乙個元素,快速排序將不幸退化為氣泡排序,最壞情況為o n 2 快速排序的平均時間複雜度為o nlogn...