2020-05-28数据结构与算法-归并排序
`package merge_sort;
// private static Comparable[] assist; //归并辅助数组
public class merge {
private static Comparable [] assist;
public static boolean less(Comparable u,Comparable v) { //判断u是否小于v
return u.compareTo(v)<0;
} //比较两个数的大小,若小于,则输出1,若大于则输出0
public static void exchange(Comparable [] a,int i,int j) {
Comparable temp;
temp=a[i];
a[i]=a[j];
a[j]=temp;
}
public static void sort(Comparable [] a) { //对数组内的元素进行排序
//定义一个lo索引和一个hi索引 初始化辅助数组
Comparable [] assist = new Comparable[a.length]; //
int lo=0; //最低位索引
int hi=a.length-1; //最高位索引
//调用sort重载方法
sort(a,lo,hi);
}
private static void sort(Comparable [] a,int lo,int hi) { //对数组内的元素索引lo到索引hi进行排序
if(lo>=hi) {
return;
} //数据不合理直接返回
//分组 定义一个中间索引
int mid=lo+(hi-lo)/2; // 中间取值
//分组排序
sort(a,lo,mid); //左子组
sort(a,mid+1,hi); //右子组
//归并
merge1(a, lo,mid, hi);
}
private static void merge1(Comparable [] a,int lo,int mid,int hi) {
//从索引lo到mid是一个子数组,从索引mid+1到hi是一个子数组,最后把两个数组合并为一个大数组
//定义三个指针
int p1=lo;
int p2=mid+1;
int i=lo;
Comparable[] assist =new Comparable[a.length];
//int[] assist = new int[a.length];
//遍历,移动p1和p2指针,比较大小
while(p1<=mid && p2<=hi) {
if(less(a[p1],a[p2])) {
assist[i++]=a[p1++];
}else {
assist[i++]=a[p2++];
}
}
//判断P1是否移动完,没有走完,就把p1里面的值继续放在辅助数组中
while(p1<=mid ) {
assist[i++]=a[p1++];
}
//判断P2是否移动完,没有走完,就把p2里面的值继续放在辅助数组中
while(p2<=hi) {
assist[i++]=a[p2++];
}
//把辅助数组中的元素拷贝到原数组中
for(int index=lo;index<=hi;index++) {
a[index]= assist[index];
}
}
}
`
测试代码块
package merge_sort;
import java.util.Arrays;
public class testMerge {
public static void main(String[] args) {
// TODO Auto-generated method stub
Comparable [] a= {1,4,5,6,8,9,3,2};
merge.sort(a);
System.out.println(Arrays.toString(a));
}
}