归并多用于数据放在不同的地方(数组,文件 ,网络)我们要将其合在一起汇总排序。这些不同地方的数据是有序的,我们再造一个空间是两个数据的长度之和(这里我写的是二路归并)。每次拿两个数据的第一个来比较,谁小依次就放到新开的空间当中,继续比较放值。(每次都是两个数据的头来比较,比一个放一个,边读边比,速度很快的)。这里还有一个很好玩的东西,那就是用一个临界点来控制两个递归,一个分解递归一个合并递归。
稍微转了几个圈,有点晕
。最后把辅助数组的值写到所要的数组当中。


package cn.hncu.sorts;
public class SortWay2 {
//输出函数
private static void print(int[] a) {
for(int num:a){
System.out.print(num+" ");
}
System.out.println();
}
//交换数组位置函数
private static void swap(int[] a, int j, int i) {
int temp;
temp=a[i];
a[i]=a[j];
a[j]=temp;
}
private static void mergeSort(int[] a, int left, int right) {
if(left<right){//卫条件防护
//1先分解
//把整个数组分解成:[left,mid] 和 [mid+1, right] ----mid=(left+right)/2
int mid=(left+right)/2;
mergeSort(a,left,mid);
mergeSort(a,mid+1,right);
//2归并
int[] b=new int[a.length];
merge(a,b,left,mid,right);
//把辅助数组b中的值写到a数组当中
coppyArray(a,b,left,right);
}
}
private static void coppyArray(int[] a, int[] b, int left, int right) {
for(int i=left;i<=right;i++){
a[i]=b[i];
}
}
private static void merge(int[] a, int[] b, int left, int mid, int right) {
int p=left;//游标,遍历a[left,mid]
int r=mid+1;//游标,遍历a[mid+1,right]
int k=left;//游标,遍历b[].合并后结果数组。指定当前判断之后所选中的元素应该放在哪个位置
while(p<=mid&&r<=right){
if(a[p]<a[r]){
b[k]=a[p++];
}else{
b[k]=a[r++];
}
k++;
}
//把其中一个子序列当中剩余的元素直接照搬到归并结果数组当中
if(p>mid){//左序列已经完成了,还剩右序列照搬进b数组
for(int i=r;i<=right;i++){
b[k++]=a[i];
}
}else{//右序列已经完成,还剩左序列照搬b数组
for (int i = p; i <=mid; i++) {
b[k++]=a[i];
}
}
}
public static void main(String[] args) {
int[] a={21,22,5,7,86,57,9,-2,37,-8};
//归并排序
mergeSort(a,0,a.length-1);
print(a);
}
}