歸併排序(merge sort)
歸併操作的工作原理如下:
效率為o(n log n)
第一步:申請空間,使其大小為兩個已經
排序 序列之和,該空間用來存放合併後的序列
第二步:設定兩個
指標 ,最初位置分別為兩個已經排序序列的起始位置
第三步:比較兩個指標所指向的元素,選擇相對小的元素放入到合併空間,並移動指標到下一位置
重複步驟3直到某一指標超出序列尾
將另一串行剩下的所有元素直接複製到合併序列尾
(1)演算法思想
歸併排序採用了分治策略(divide-and-conquer),就是將原問題分解為一些規模較小的相似子問題,然後遞迴解決這些子問題,最後合併其結果作為原問題的解。
歸併排序將待排序陣列a[1..n]
分
成兩個各含n/2個元素的子串行,然後對這個兩個子串行進行
遞迴
排序,最後將這兩個已排序的子串行進行
合併
,即得到最終排好序的序列。
具體排序過程如下圖所示:
排序圖:
分別從左到右比較兩個陣列中哪乙個值比較小,然後複製進新的陣列中,一直比較到兩個陣列中有某乙個先到末尾為止,最後把另乙個陣列中的剩餘元素複製進新陣列即可。
將乙個陣列一直對半分,問題的規模就減小了,再重複進行這個過程,直到元素的個數為乙個時,乙個元素就相當於是排好順序的。
由於前提是這個兩個陣列都是有序的,所以這整個過程是很快的,我們可以看出,對於一對長度為n的陣列,進行合併所需要的比較次數
最多為2 * n -1。
package com.sunmac.eightsort;
/**
複雜度:
*歸併排序(遞迴)
*/ public class mergesort ;
sortarray(a);
for (int i : a)
}//外部介面方法
public static void sortarray(inta)
//遞迴排序的方法
private static void mergesort(inta,int low,int high)
system.out.println();}}
private static void merge(int a,int low,int mid,int high) else
}// 把左邊剩餘的數移入陣列
while (i <= mid)
// 把右邊邊剩餘的數移入陣列
while (j <= high)
// 把新陣列中的數覆蓋原陣列
八大排序演算法 之 歸併排序
排序思想 如圖所示 排序趟數 如果2 n 如此例,length 9 8,趟數是4.排序原理 1,第一趟將相鄰兩個數歸併成乙個有序的小組合 2,第二趟將相鄰兩個有序小組合歸併成乙個更大的的有序組合 3,依次類推,直到將所有數歸併成乙個最大的組合 具體 實現如下 歸併排序主方法 public stati...
八大排序演算法之歸併排序
介紹到這裡只剩下歸併排序和基數排序沒有介紹過了。這兩種演算法各有各的特點,歸併排序是分治法的一種有效應用,所謂歸併是指將若干個已排好序的部分合併成乙個有序的部分。而基數排序又稱為桶排序,是唯一一種不需要元素之間相互比較就可以排好序的排序演算法。一 歸併排序 1.基本思想 這裡介紹的歸併排序是非遞迴版...
八大排序演算法之歸併排序
歸併排序的核心是,每次將兩個有序陣列組合成為乙個新的有序陣列。對於倆個有序陣列 def merge a list,b list list l a,l b len a len b res 0 for i in range l a l b index 0 i,j 0,0 while i歸併排序中,兩個有...