归并排序(Merge)是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的。然后再把有序子序列合并为整体有序序列。
归并排序的效率是比较高的,设数列长为N,将数列分开成小数列一共要logN步,每步都是一个合并有序数列的过程,时间复杂度可以记为O(N),故一共为O(N*logN)。因为归并排序每次都是在相邻的数据中进行操作,所以归并排序在O(N*logN)的几种排序方法(快速排序,归并排序,希尔排序,堆排序)也是效率比较高的。
算法流程:
1、将一个数组拆分为两个,从中间点拆开,通过递归操作来实现一层一层拆分。
2、从左右数组中选择小的元素放入到临时空间,并移动下标到下一位置。
3、重复步骤2直到某一下标达到尾部。
4、将另一序列剩下的所有元素依次放入临时空间。
5、将临时空间的数据依次放入原数据数组。
public class MergerSort {
public static int count=0;
public static void mergersort(int[] data){
sort(data, 0,data.length-1);
}
public static void sort(int[] data,int left,int right){
//递归结束条件
if (left>=right) {
return;
}
//确定一个中心拆分点
int center=(left+right)/2;
//对中心拆分点的左边进行排序
sort(data, left, center);
//对中心拆分点的右边进行排序
sort(data, center+1, right);
//合并左右两边的元素
merge(data,left,center,right);
query(data);
}
public static void merge(int[] data,int left,int center,int right){
//创建一个临时数组
int[] temparr=new int[data.length];
//左数组的第一个变量的索引
int lindex=left;
//右数组的第一个变量的索引
int rindex=center+1;
//临时数组的索引
int index=left;
//从左右数组中找出最小的元素依次放到临时数组中
while (lindex<=center&&rindex<=right) {
if (data[lindex]<=data[rindex]) {
temparr[index]=data[lindex];
index++;
lindex++;
}
else {
temparr[index]=data[rindex];
index++;
rindex++;
}
}
//将左数组还没放进去的元素放入临时数组
while (lindex<=center) {
temparr[index]=data[lindex];
index++;
lindex++;
}
//将右数组还没放进去的元素放入临时数组
while (rindex<=right) {
temparr[index]=data[rindex];
index++;
rindex++;
}
//将临时数组的值复制到原数组中
index=left;
while (index<=right) {
data[index]=temparr[index];
index++;
}
}
public static void main(String[] args) {
int[] data={5,9,1,4,7,0,8,3,6,2};
query(data);
mergersort(data);
query(data);
}
public static void query(int[] data){
System.out.print("第"+count+"次排序: ");
count++;
for(int i=0;i<data.length;i++){
System.out.print(data[i]+" ");
}
System.out.println();
}
}
排序结果为:
第0次排序: 5 9 1 4 7 0 8 3 6 2
第1次排序: 5 9 1 4 7 0 8 3 6 2
第2次排序: 1 5 9 4 7 0 8 3 6 2
第3次排序: 1 5 9 4 7 0 8 3 6 2
第4次排序: 1 4 5 7 9 0 8 3 6 2
第5次排序: 1 4 5 7 9 0 8 3 6 2
第6次排序: 1 4 5 7 9 0 3 8 6 2
第7次排序: 1 4 5 7 9 0 3 8 2 6
第8次排序: 1 4 5 7 9 0 2 3 6 8
第9次排序: 0 1 2 3 4 5 6 7 8 9
第10次排序: 0 1 2 3 4 5 6 7 8 9