学习归并排序时,遇到递归的思想。
测试输入 mergesortexample
单步调试到,if (hi<=lo) return;当hi=0,lo=0时,执行return,在我理解中,return就是退出方法了,为何会跳到 sort(a,mid+1,hi);而且此时,lo=0,hi=1?
private static void sort(Comparable[] a,int lo,int hi){
//将数组a【lo hi】排序
if (hi<=lo) return;
int mid=lo+(hi-lo)/2;
sort(a,lo,mid);
sort(a,mid+1,hi);
merge(a,lo,mid,hi);
}
import java.util.Scanner;
public class Merge {
private static Comparable[] aux;
public static void sort(Comparable[] a){
aux=new Comparable[a.length];
sort(a,0,a.length-1);
}
private static boolean less(Comparable v,Comparable w){
return v.compareTo(w)<0;
}
public static void merge(Comparable[] a,int lo,int mid,int hi){
//将a【lo mid】与a【mid+1,hi】归并
int i=lo;
int j=mid+1;
for(int k=lo;k<=hi;k++){
aux[k]=a[k];
}
for(int k=lo;k<=hi;k++){
if(i>mid) a[k]=aux[j++];
else if(j>hi) a[k]=aux[i++];
else if(less(aux[j],aux[i])) a[k]=aux[j++];
else a[k]=aux[i++];
}
}
private static void sort(Comparable[] a,int lo,int hi){
//将数组a【lo hi】排序
if (hi<=lo) return;
int mid=lo+(hi-lo)/2;
sort(a,lo,mid);
sort(a,mid+1,hi);
merge(a,lo,mid,hi);
}
private static void show(Comparable[] a){
//在单行中打印数组
for(int i=0; i<a.length;i++)
System.out.print(a[i]+"");
System.out.println();
}
public static boolean isSorted(Comparable[] a){
//测试数组是否有序
for(int i=1;i<a.length;i++)
if(less(a[i],a[i-1])) return false;
return true;
}
public static void main(String[] args){
//从标准输入读取字符串,将它们排序并输出
System.out.print("输入");
Scanner s = new Scanner(System.in);
String line=s.nextLine();
System.out.println("输入的是"+line);
char [] charArr =line.toCharArray();
String[] strArr = new String[charArr.length];
for(int i = 0; i < strArr.length; i++) {
strArr[i] = String.valueOf(charArr[i]);
}
sort(strArr);
assert isSorted(strArr);
show(strArr);
}
}