穩定原地排序
時間複雜度
空間複雜度
歸併排序✔✘
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 的思想 分治也是乙個很不錯的演...