package cn.xiaobo.MergeSort;html
import java.sql.Time;
import java.util.Timer;java
/**
* 歸併排序最差的狀況下,比較次數爲NlgN;比較次數在lgN和NlgN之間;
* @author Administrator
*
*/
public class MergeSortMain {算法
public static void main(String[] args) {
MergeSortApp mergeSortApp=new MergeSortApp();
int[] a=new int[11];
a[0]=12;
a[1]=23;
a[2]=1;
a[3]=78;
a[4]=22;
a[5]=9;
a[6]=8;
a[7]=7;
a[8]=6;
a[9]=45;
a[10]=67;
mergeSortApp.sort(a, 0, 10);
int i;
for(i=0;i<a.length;i++){
System.out.println("a數組"+i+"的數值爲:"+a[i]);
}
}
}sql
package cn.xiaobo.MergeSort;數組
/**
* 對兩個數組進行合併;
* @param a 要排序的數組
* @param first 起始位置
* @param last 終止位置
*/ide
public class MergeSortApp {
private void mergeArray(int[] a,int first,int last,int mid) {
int i=first,j=mid+1;
int n=last;
int m=mid;
int k=0;
int[] temp=new int[last-first+1];
//終止的條件是i小於k
while(i<=m&&j<=n){
//對劃分爲兩邊的數據進行對比,將較小的放到臨時的數組中;
if(a[i]<=a[j]){
temp[k++]=a[i++];
}else{
temp[k++]=a[j++];
}
}
//若是由於對比,一組數據的所有進了temp,而另外一組沒有進入,
//則將剩下的數據放入到tmep中;
while(i<=m){
temp[k++]=a[i++];
}
while(j<=n){
temp[k++]=a[j++];
}
//將temp的值返回給a,這樣a就是有序的了
//請注意記得temp的下標與a的下標,first的值不必定都是爲0
//每次調用mergeArray都會建立一個temp數組;都是恰好能裝合併後的元素的個數;
for(i=0;i<k;i++){
a[first+i]=temp[i];
}
}
/**
* 相似於二叉樹的遍歷,進行比較;
* @param a 要排序的數組
* @param first 起始位置
* @param last 終止位置
*/
public void sort(int[] a,int first,int last) {
//當劃分到first==last時已經退出循環;最小單元是擁有兩個數據的的數組
//而後有序了,兩兩比較,比較完後4 4比較;
if(first<last){
int mid=(first+last)/2;
//從小處開始進行排序;
sort(a, first,mid);
//從mid+1到last進行排序;
sort(a, mid+1,last);
mergeArray(a, first, last, mid);
}
}
}spa