排序演算法(2) 歸併排序 快速排序

2021-08-31 07:40:05 字數 1323 閱讀 8511

穩定原地排序

時間複雜度

空間複雜度

歸併排序✔✘

o(n logn)

o(n)

快速排序✘✔

o(n logn)

歸併排序的合併函式,在合併兩個有序陣列為乙個有序的時,需要借助額外的儲存空間

public

class

mergesort

private

static

void

mergesortinternally

(int

a,int p,

int r)

private

static

void

merge

(int

a,int p,

int q,

int r)

else

}//判斷哪個子陣列中有剩餘的資料

int start = i;

int end = q;

if(j <= r)

//將剩餘的資料拷貝到 tmp

while

(start <= end)

//將 tmp 中的陣列考回 a[p...r]

for(i =

0; i <= r - p;

++i)

}}

處理類似選擇排序,通過游標 i 將 a[p..r-1] 分成2部分,a[p..i-1] 都是小於 pivot, 稱為「已處理區間」,

a[i..r-1] 是未處理區間。每次從未處理的區間取乙個元素a[j] 與 pivot 比較。如果小於 pivot,則將其

加入已處理區間的尾部,即 a[i] 的位置

public

class

quicksort

private

static

void

quicksortinternally

(int

a,int p,

int r)

private

static

intpartition

(int

a,int p,

int r)

}int tmp = a[i]

; a[i]

= a[r]

; a[r]

= tmp;

system.out.

println

("i = "

+ i)

;return i;

}}

排序演算法(2) 歸併排序,快速排序

分治思想 思想 將兩個有序的陣列歸併成乙個有序陣列。下面兩種歸併方法用到 建立乙個適當大小的陣列,然後將兩個有序陣列乙個個有序的放入所建立的陣列中 在此造成了額外的空間儲存問題 方法簽名 merge array,lo,hi 將子陣列a lo.mid a mid 1.hi 歸併,並將結果放入大a lo...

排序演算法 2 歸併排序

歸併排序使用了分治的思想,即將乙個陣列的排序分解為兩個子陣列 首先分解為規模更小的子問題 然後對這兩個子陣列分別排序 分而治之 最後對兩個已排序的子陣列進行合併 合併子問題結果 關鍵在於,合併操作只需要o n 的時間複雜度,那麼根據master定理,歸併排序的整體時間複雜度為o lg n 從漸進時間...

白話排序演算法(歸併排序,快速排序)

排序演算法已經完成了兩篇了 選擇,插入,冒泡 希爾排序 繼續把常用的演算法完成掉,下面我們來討論下關於歸併排序,快速排序,這兩種高階排序演算法。這兩種演算法是線性的也即對於o nlogn 的排序演算法。歸併排序 歸併排序用的是分治 divide and conquer 的思想 分治也是乙個很不錯的演...