**歸併排序是建立在歸併操作上採用分治法的一種排序演算法。**
將2個有序數列進行歸併操作。比較2數列第乙個數的大小,取小的放入合併數列並刪除該數,直至乙個數列為空,則將另一數列一次新增至合併數列。
memeryarray(int a, int b,int c)
while (i < a.length)
c[k++] = c[i++];
while (j < b.length)
c[k++] = c[j++];
}
歸併數列的時間複雜度為o(n)。
對陣列歸併排序思路:遞迴的 每次將陣列分為2組 直至各組為1個元素時,這些陣列有序,然後再合併陣列。
5434762362
54347 62362
54 347 62 362
5 4 3 47 6 2 3 62
5 4 3 4 7 6 2 3 6 2
5 4 3 47 6 2 3 26
45 347 26 236
34457 22366
223344567
上面是乙個陣列進行歸併排序得分解步驟。
實現**
呼叫:***是排序得陣列,tmp為中間陣列
mergesort(***, 0, ***.length-1,tmp);
static
void memeryarray(int a, int first, int mid, int last, int tmp)
while (i <= m)
tmp[k++] = a[i++];
while ( j <= n)
tmp[k++] = a[j++];
/*** 複製歸併陣列
*/for (i = 0; i < k; i++)
}static
void mergesort(int a, int first, int last, int b)
}
測試:建立隨機數陣列,排序成功。
效率:陣列個數 時間(ms)
10 1 0 1
100 0 0 1
1000 8 2 1
10000 3 20 3
100000 21 25 24
可以看
出,隨著陣列的增大,排序時間增加不大。定義時間複雜度n*logn。 常用排序演算法遞迴篇之歸併排序
合併排序是建立在歸併操作上的一種有效的排序演算法。該演算法是採用分治法的乙個非常典型的應用。合併排序法是將兩個 或兩個以上 有序表合併成乙個新的有序表,即把待排序序列分為若干個子串行,每個子串行是有序的。然後再把有序子串行合併為整體有序序列。將已有序的子串行合併,得到完全有序的序列 即先使每個子串行...
演算法之歸併排序
歸併排序 void mergearray int a,int temp,int left,int mid,int right else while i1 mid while i2 right for int i 0 i k i 上面 為合併a left,mid 和a mid 1,right 的 因為...
演算法之歸併排序
歸併排序是分治法 divide and conquer 的經典案例。分治模式在每一層遞迴上都有三個步驟 分解 divide 將原問題分解成一系列子問題 解決 conquer 遞迴地解各子問題。若子問題足夠小,則直接求解 合併 combine 將子問題的結果合併成原問題的解。歸併排序 merge so...