归并排序:采用分治策略的一种排序算法,先把要排序的数组分成两个有序的序列,然后再比较两个有序序列的最小值进行排序。排序的时间复杂度是O(nlgn)。
下面是用java实现的代码
/**
* 归并排序
*
*/
public class MergeSort {
//两个有序数组的归并
public void merge(Integer begin,Integer end,Integer n,Integer[] data){
int b1=begin;
int b2=n+1;
//把后一个数组归并到前一个数组里,没有新建数组,只是在原来的数组上进行移动
while(b2<=end){
//比较两个数组中最小的两个数就行,如果第一个数组的数小,则不用移动,否则进行移动
if(data[b1]>data[b2]){
//把b2放在b1的前面
int temp=data[b2];
int b2l=b2;
while(b2l>b1){
data[b2l]=data[b2l-1];
b2l--;
}
data[b1]=temp;
//移动之后,第二个数组的下标加1
b2++;
//移动之后,第一个数组占据了第二个数组的一个位置,所以n要+1
n++;
}else{
//第一个数组的值小,则第一个数组的下标加1
b1++;
if(b1>n){
return;
}
}
}
}
public void mergeSort(int begin,int end,Integer[] data){
int n=(begin+end)/2;
if(begin<end){
mergeSort(begin,n, data);
mergeSort(n+1,end, data);
merge(begin,end,n,data);
}
}
/**
* 排序分为三部分
* 1、1到(n+1)/2之前的排序
* 2、(n+1)/2和n之前的排序
* 3、两个有序之间的合并
* @param data
*/
public void sort(Integer[] data){
int n=(data.length)/2;
int begin=0;
int end=data.length-1;
if(begin<end){
mergeSort(begin,n, data);
mergeSort(n+1,end, data);
merge(begin,end,n,data);
}
}
public static void main(String[] args) {
Integer[] data=new Integer[]{2,6,9,90,99,3,88,100,120,1,7,130};
MergeSort sort=new MergeSort();
//sort.merge(0,data.length-1,data.length/2, data);;
sort.sort(data);
for(int i=0;i<data.length;i++){
System.out.print(data[i]+" ");
}
}
}
运行之后输出为:
1 2 3 6 7 9 88 90 99 100 120 130