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