**示例:
//歸併排序
public
class
code_05_mergesort
mergesort
(arr,
0, arr.length -1)
;}public
static
void
mergesort
(int
arr,
int l,
int r)
int mid = l +
((r - l)
>>1)
;mergesort
(arr, l, mid)
;mergesort
(arr, mid +
1, r)
;merge
(arr, l, mid, r);}
public
static
void
merge
(int
arr,
int l,
int m,
int r)
while
(p1 <= m)
while
(p2 <= r)
for(i =
0; i < help.length; i++)}
}
歸併的時間複雜度分析:主要考慮兩個函式的時間花銷,一、陣列劃分函式 二、有序陣列歸併函式
前者的時間複雜度為o(n),因為**中有2個長度為n的迴圈,所以時間複雜度為o(n);
陣列長度為n的歸併排序所消耗的時間t[n]:呼叫前面函式將陣列劃分為兩個部分,那每乙個部分排序好所花時間為t[n/2],最後將這兩個部分的陣列合併成乙個有序陣列的時間花費為o(n);
公式:t[n]=2t[n/2]+o(n);
最終得出結果為:t[n]=o(nlogn);
因為不管元素在什麼情況下都要做出這些步驟,所花銷的時間是不變的,所以該演算法的最優時間複雜度和最差時間複雜度以及平均複雜度是一致的:o(nlogn)。
小和問題
在乙個陣列中,每乙個數左邊比當前數小的數累加起來,叫做這個陣列的小和。求乙個陣列
的小和。
例子:[1,3,4,2,5]
1左邊比1小的數,沒有;
3左邊比3小的數,1;
4左邊比4小的數,1、3;
2左邊比2小的數,1;
5左邊比5小的數,1、3、4、2;
所以小和為1+1+3+1+1+3+4+2=16
題目解析:
相當於求陣列中每乙個元素右邊有幾個比自己大的元素,然後用這個個數乘以自身,對每個元素求得的這樣的數相加的到的結果。
使用歸併排序來進行求和,在歸併的時候把陣列分成左右兩個,在歸併排序進行左右兩個陣列進行合併排序的時候進行計算。
如果左邊陣列元素n,小於右邊陣列元素m,那麼從右邊陣列右指標p到右邊陣列最後r就有(r-p+1)個n,依次累計相加,最後求出最小和。
**示例:
public
class
code_12_smallsum
return
mergesort
(arr,
0, arr.length -1)
;}public
static
intmergesort
(int
arr,
int l,
int r)
int mid = l +
((r - l)
>>1)
;return
mergesort
(arr, l, mid)
+mergesort
(arr, mid +
1, r)
+merge
(arr, l, mid, r);}
public
static
intmerge
(int
arr,
int l,
int m,
int r)
while
(p1 <= m)
while
(p2 <= r)
for(i =
0; i < help.length; i++
)return res;
}}
資料結構和演算法之歸併排序
思想 分治策略 就是分治法是將大問題劃分成乙個乙個的小模組採用遞迴求解 而治的階段就是在分的階段進行一些 修補 的行為 即分而治之 步驟和相關 1 先將陣列中的資料用遞迴演算法分解成小模組的資料 也就是將大問題分解成小問題 將陣列中的資料進行分治 public static void mergeso...
資料結構 排序演算法之歸併排序
基本思想 將待排序的元素序列分成兩個等長的子串行,再將子串行劃分子串行,直到子串行中只有乙個元素就不用在對子序列繼續進行劃分,將劃分的每個區塊,進行排序,然後再將其歸併到乙個序列中,直到將所有的子串行歸併完成之後,則這個序列就完成了排序。1 基本思想如下所示 經過上面的劃分,從而可以看出經過劃分與歸...
資料結構 排序演算法之歸併排序
演算法思想 歸併排序是利用歸併的思想實現的排序方法,該演算法採用 分而治之 的思想將問題分成一些小的問題然後遞迴實現,最後合而為之。實現 遞迴實現 void merge int arr,const int left,const int mid,const int right,int temp whi...