题目
使用归并算法排序
输入
[6,1,2,7,9,3,4,5,10,8]
输出
[1,2,3,4,5,6,7,8,9,10]
解析
归并算法其实是一种分治思想。先将数组递归拆分到最小粒度,再进行排序后合并。
其中合并治理使用空间换时间
编码
public static void main(String[] args) {
int[] data = {6,1,2,7,9,3,4,5,10,8};
print("输入",data);
sort(data,0,data.length-1);
print("\n输出",data);
}
private static int[] sort(int[] data,int low,int high){
if(low<high){
int mid=(low+high)/2;
sort(data,low,mid);
sort(data,mid+1,high);
merge(data,low,mid,high);
}
return data;
}
private static void merge(int[] data,int low,int mid,int high){
int[] temp = new int[high-low+1];
List<Integer> ls= Arrays.stream(data).boxed().collect(Collectors.toList());
print("\n合并过程:",new Object[]{low,mid,high});
print("合并区间",ls.subList(low,high+1));
int i=low;
int j=mid+1;
int k=0;
while (i<=mid && j<=high){
if(data[i]<data[j]){
temp[k]=data[i];
i++;
}else{
temp[k]=data[j];
j++;
}
k++;
}
while(i<=mid){
temp[k]=data[i];
k++;
i++;
}
while (j<=high){
temp[k]=data[j];
k++;
j++;
}
print("合并后区间",temp);
for (int l = 0; l < temp.length; l++) {
data[low+l]=temp[l];
}
print("合并后数组",data);
}
运行结果
输入:[6,1,2,7,9,3,4,5,10,8]
合并过程::[0,0,1]
合并区间:[6,1]
合并后区间:[1,6]
合并后数组:[1,6,2,7,9,3,4,5,10,8]
合并过程::[0,1,2]
合并区间:[1,6,2]
合并后区间:[1,2,6]
合并后数组:[1,2,6,7,9,3,4,5,10,8]
合并过程::[3,3,4]
合并区间:[7,9]
合并后区间:[7,9]
合并后数组:[1,2,6,7,9,3,4,5,10,8]
合并过程::[0,2,4]
合并区间:[1,2,6,7,9]
合并后区间:[1,2,6,7,9]
合并后数组:[1,2,6,7,9,3,4,5,10,8]
合并过程::[5,5,6]
合并区间:[3,4]
合并后区间:[3,4]
合并后数组:[1,2,6,7,9,3,4,5,10,8]
合并过程::[5,6,7]
合并区间:[3,4,5]
合并后区间:[3,4,5]
合并后数组:[1,2,6,7,9,3,4,5,10,8]
合并过程::[8,8,9]
合并区间:[10,8]
合并后区间:[8,10]
合并后数组:[1,2,6,7,9,3,4,5,8,10]
合并过程::[5,7,9]
合并区间:[3,4,5,8,10]
合并后区间:[3,4,5,8,10]
合并后数组:[1,2,6,7,9,3,4,5,8,10]
合并过程::[0,4,9]
合并区间:[1,2,6,7,9,3,4,5,8,10]
合并后区间:[1,2,3,4,5,6,7,8,9,10]
合并后数组:[1,2,3,4,5,6,7,8,9,10]
输出:[1,2,3,4,5,6,7,8,9,10]