原理:
归并排序是利用递归与分治技术将数据序列划分为越来越小的半子表,再对半子表排序,最后利用递归的方法将排好序的半子表合并为越来越大的有序序列。
归并排序算法原理:
对于给定的一组记录(假设有n个记录),首先将每两个相邻的长度为1的子序列进行归并。得到n/个长度为2或1的有序子序列,再将其两两归并,反复执行此过程,直到得到一个有序序列。
代码如下:
/** * 5归并排序 * 将两个(两个以上)有序表合并成一个新的有序表 * 将待排的序列分为若干个子序列,每个字序列是有序的 * 然后再将有序子序列合并为整体的有序序列 * * 最好最坏都是nlogn * 稳定 * 空间n+logn 有n的临时数组存储以及递归的深度为logn * @param a * @param lo * @param med * @param hi */
//合并的过程
public void merge(int[] a,int lo,int med,int hi){
int temp[]=new int[hi-lo+1];
int i=lo;//左边有序数组
int j=med+1;//右边有序数组
int k=0;
//把较小的数先移动到新的临时数组中去
while(i<=med && j<=hi){
if(a[i] < a[j]){
temp[k++]=a[i++];
}else{
temp[k++]=a[j++];
}
}
//左边剩余的数移到数组
while(i <= med){
temp[k++]=a[i++];
}
while(j <= hi){
temp[k++]=a[j++];
}
//新的数组覆蓋
for(int n=0;n<temp.length;n++){
a[n+lo]=temp[n];
}
}
public void mergeSort(int[] a,int lo,int hi){
int med=(lo+hi)/2;
if(lo < hi){
//左边继续分割
mergeSort(a,lo,med);
//右边继续分割
mergeSort(a,med+1,hi);
//归并
merge(a,lo,med,hi);
}
}