这里讲的是归并排序的递归算法,非递归算法将在后续补充
归并我们采用分治的思想,
1.首先给出一个数组,我们可以将其一分为二;
2.对于两个子数组的我们也要对其进行排序然后将两个有序的数组合并;
3.将两个有序的数组合并在一起,时间复杂度为O(n);
4.对与两个子数组的处理我们可以回归到第一步,故可以采用递归的方式
不多说先上代码 :
<span style="font-family:KaiTi_GB2312;font-size:18px;">package sort;
import sortbasic.SortBase;
public class MergeSort extends SortBase {
static Comparable[] aux;
public static void sort(Comparable[] a,int begin,int end ){
if(begin==end)return;
int mid =(begin+end)/2;
sort(a,begin,mid);
sort(a,mid+1,end);
merge(a,begin,mid,end);
}
private static void merge(Comparable[] a, int begin, int mid, int end) {
int i=begin;
int j=mid+1;
for (int k = begin; k<end+1; k++) //将要归并的部分拷贝到辅助数组
aux[k]=a[k];
}
for (int k = begin; k <end+1; k++) {//两个有序数组的合并 (值得细看)
if(i>mid) a[k]=aux[j++];
else if(j>end) a[k]=aux[i++];
else a[k]=less(aux[i], aux[j])?aux[i++]:aux[j++];
}
}
public static void main(String[] args) {
Comparable[] a=generateArray(15);
aux = new Integer[a.length];
sort(a, 0, a.length-1);
show(a);
System.out.println(isSorted(a));
}
}
</span>
result:
10 14 29 157 173 278 552 671 764 803 823 849 872 922 982true
sort方法里面的步骤如下:
1.将数组一分为二
2.对左边数组使用归并排序
3.对右边数组使用归并排序
4.将左右数组合并(merge)
merge方法是归并排序中的难点,要注意的是:我们得借用辅助数组,因为左右数组的归并要借用辅助数组才能较好的完成
归并排序的时间复杂度:
一分为二分到底 时间复杂度为O(log n)
merge过程 时间复杂度为O(n)
故为O(nlog n)