1.分治思想
顧名思義,就是分而治之的意思,將大問題換分為無數個小問題,小的問題解決了,大的問題自然也就解決了。分之演算法一般都是用遞迴來實現的。分治是一種解決問題的處理思想,遞迴是是一種程式設計技巧。2.歸併排序
歸併排序的核心思想:就是講乙個陣列分為前後兩部分分別進行排序,然後將有序的兩個陣列再合併,就可以了。歸併排序用到的是就是分治思想,就是把大問題轉換為小的問題,可以用遞迴解決。
**:
public
static
void
mergesort
(int
a,int n)
private
static
void
mrgesortinternally
(int
a,int p,
int r)
/** * 合併兩個有序陣列
* @param arr 陣列
* @param p 陣列長度
* @param q 陣列的中點
* @param r 陣列的尾節點
*/public
static
void
merge
(int
arr,
int p,
int q,
int r)
else
}int start = i;
int end = q;
if(i>p)
while
(start<=end)
for(
int f=
0;f)/* if(i==p)
}else
}*/}
歸併排序的演算法分析
1.是否為原地排序。
根據**可以看出來排序演算法進行兩個陣列合併的時候需要額外的乙個陣列去儲存,空間複雜度為o(n),所以歸併排序不是乙個原地排序演算法。
2.是否為穩定排序
是。3.歸併排序的時間複雜度。
歸併排序的時間複雜度比較複雜,這裡就不多做分析,直接上結論,歸併排序的時間複雜度為o(n*logn).
而且歸併排序的時間複雜度和有序度無關,最好,最壞、平均時間複雜度都為o(n*logn)。
3.快速排序
快速排序的實現也是基於歸併排序的,不過跟歸併排序的過程剛好相反,歸併排序是先分成兩個再合併,**:快速排序是找乙個說句pivot(分割槽點),將陣列分為兩個區間,乙個區間是都大於它的資料,另外乙個區間是都小於它的資料。
public
static
void
quicksort
(int
arr,
int n)
/** * 進行分治的演算法
* @param arr
* @param p
* @param r
*/public
static
void
quicksortinternally
(int
arr,
int p,
int r)
public
static
intpartition
(int arr,
int p,
int r)
} arr[r]
=arr[i]
; arr[i]
=pivot;
system.out.
println
("i="
+i);
return i;
}
快速排序的演算法分析
排序演算法的時間複雜度跟每次分割槽的結果有關,如果分割槽均衡時間複雜度就睡平均時間複雜度,如果分割槽及其不均衡時間複雜度就會退化到o(n^2)。
快速排序的分割槽點取值方法:
1.三數取中法
就是從區間的首、尾、中取出三個數比較大小取中間值做分割槽點。
當資料量特別大的時候也可以採用五數取中法,或者十數取中法。
2.隨機法
就是從排序區間中,隨機取出乙個數作為分割槽點,這種做法並不能保證每次分割槽點都選的比較好,
但是概率的角度來講不大可能會出現每次分割槽點都很差的情況。
-排序-
-平均複雜度-
-是否為原地排序-
–-是否為穩定的排序演算法-
歸併排序
o(nlogn否是
快速排序
o(nlogn是否
有興趣的朋友可以看下我的下篇文
線形排序
歸併排序與快速排序
1.演算法簡介 歸併排序和快速排序都是採用遞迴的結構實現的,不同的是歸併排序在遞迴過程中有合併子串行的過程,而快速排序中沒有,但是快速排序中有較為複雜的劃分過程。二者的平均時間複雜度均為o nlgn 其中快速排序的係數較小 歸併排序最壞情況複雜度為o nlgn 快排在最壞情況下時間複雜度為o n 2...
快速排序與歸併排序
簡單總結一下快速排序和歸併排序的用法,這兩種方法十分省時,在題目中常用。快速排序 基本思想通過一趟排序將代拍記錄分成兩部分,一部分記錄關鍵字比另一部分小,再對這兩部分記錄繼續排序,達到整個序列有序。具體做法是附設兩個指標i和j,初值分別為l,r,任選乙個記錄做樞紐取mid,首先從j位置向前搜找到第乙...
歸併排序與快速排序
void merge sort int arr,int l,int r private static void quicksort int arr,int low,int high private static int getindex int arr,int low,int high 如果隊尾元素...