需求:
排序前{8,4,5,7,1,3,6,2}
排序后{1,2,3,4,5,6,7,8,}
排序原理:
1. 将数据分为{8,4,5,7},{1,3,6,2}两组。
2. 将每组在细分为{8,4},{5,7},{1,3},{6,2}。
3. 在分为{8},{4}......
4. 将相邻子组合并成一个有序的大组(这里用到了递归)。
5. 不断重复4步骤直到最后最终只有一个大组
归并排序API设计:
public class Test {
public static void main(String[] args) {
Integer [] arr = {8,4,5,7,1,3,6,2};
Merge.sort(arr);
System.out.println(Arrays.toString(arr));
}
}
class Merge{
private static Comparable[] assist;
//比较v元素是否小于w元素
private static boolean less(Comparable v,Comparable w){
return v.compareTo(w)<0;
}
//交换元素
private static void exch(Comparable[] a,int i,int j){
Comparable t = a[i];
a[i] = a[j];
a[j] = t;
}
//对数组a的元素进行排序
public static void sort(Comparable[] a){
//初始化辅助数组 assist
assist = new Comparable[a.length];
//定义lo,hi变量记录数组中最小索引和最大索引
int lo = 0;
int hi = a.length -1 ;
//调用sort 重载方法完成数组a中,从lo 到 hi 的排序
sort(a,lo,hi);
}
//对数组中从lo 到hi 的元素进行排序
private static void sort(Comparable [] a,int lo,int hi ){
if (lo>=hi){//安全校验一下
return;
}
//对数据进行拆分
int mid = lo+(hi-lo)/2;
//对每组数据分别进行排序
sort(a,lo,mid);
sort(a,mid+1,hi);
//把两个组元素进行归并
merge(a,lo,mid,hi);
}
private static void merge(Comparable[] a,int lo,int mid,int hi){
//遍历移动指针 p1,p2,找出小的放在辅助数组对应的索引处
int i = lo;
int p1 = lo;
int p2 = mid + 1;
while (p1<=mid&&p2<=hi){
if (less(a[p1],a[p2])){
assist[i++] = a[p1++];
}else{
assist[i++] = a[p2++];
}
}
//p1还有数据就接着拷贝过去
while (p1<=mid){
assist[i++] = a[p1++];
}
//p2还有数据就接着拷贝过去
while (p2<=hi){
assist[i++] = a[p2++];
}
//临时数组赋给a
for (int j = lo; j <= hi; j++) {
a[j] = assist[j];
}
}