用递归的归并排序需要深度为LogN的栈空间,虽然代码很简单易懂,但是会造成时间和空间上的性能损耗,为了优化归并排序,我们可以使用迭代代替递归。
//使用递归的方式进行归并排序,所需要的空间复杂度是O(N+logN)。
//怎么理解这个递归?就把它当做只能分成两个子序列即可。
public class ZZ {
public static void main(String[] args) {
int[] arr = {3, 4, 2, 5, 7, 0, 9, 8, 1, 6};
mergeSort(arr, 0, arr.length - 1);
printArr(arr);
}
public static void mergeSort(int[] arr, int low, int high) {//low,high都是数组的坐标
int middle=(low+high)/2;
if(low<high){
mergeSort(arr,low,middle);
mergeSort(arr,middle+1,high);
merge(arr,low,middle,high);//merge方法实际上是将两个有序数组合并成一个有序数组
}
}
public static void merge(int[]arr,int low,int middle,int high){
int[] temp=new int[high-low+1];//temp数组用于暂存合并的结果
int i=low;
int j=middle+1;
int k;
for (k=0 ;i<=middle && j<=high ;k++) {
//大于的才交换
if(arr[i]>arr[j]){
temp[k]=arr[j];
j++;
}else{
temp[k]=arr[i];
i++;
}
}
//以下两个while循环,只能执行一个。因为在上面的for循环终止条件的限制。
while(i<=middle){
temp[k]=arr[i];
i++;
k++;
}
while(j<=high){
temp[k]=arr[j];
j++;
k++;
}
for (int l = 0; l <temp.length; l++) {
arr[low+l]=temp[l];
}
}
public static void printArr(int[] arr) {
System.out.print("排序结果为: ");
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + " ");
}
System.out.println();
}
}