package com.yang.sort;
import static com.yang.sort.SelectSort.printArrays;
/**
* 归并排序:核心在于如何实现,将左边有序和右边有序的两个部分归并为一个,
* 将数组分为多个有序的子序列,然后在组合在一个新的数组空间里面(i,j,k). 重点(*****)
* 时间复杂度:O(nLogN)
*/
public class MergeSort {
public static void main(String[] args) {
int[] a={0,3,1,5,4,2,8,7,9,6};
System.out.println("排序前的数组为:");
printArrays(a);
System.out.println();
System.out.println("排序后的数组为:");
sort(a,0,a.length-1);
printArrays(a);
}
public static void sort(int[] a,int left,int right){
//递归出口
if(left==right) return;
//分成两半
int mid=left+(right-left)/2;
//左边排序
sort(a,left,mid);
//右边排序
sort(a,mid+1,right);
//归并
mergeSort(a,left,mid,right);
}
/**
*
* @param a:数组
* @param leftPtr:数组的左边界
* @param rightPtr:数组的左边有序的最后一个元素的位置
* @param boundPtr:数组的右边界
*/
public static void mergeSort(int[] a,int leftPtr,int rightPtr,int boundPtr){
int mid=rightPtr+1;
int[] temp=new int[boundPtr-leftPtr+1];
int i=leftPtr;
int j=mid;
int k=0;
while (i<=rightPtr&&j<=boundPtr){
temp[k++]=a[i]<=a[j]?a[i++]:a[j++];
// if(a[i]<=a[j]){
// temp[k]=a[i];
// i++;
// k++;
// }else{
// temp[k]=a[j];
// j++;
// k++;
// }
}
while (i<=rightPtr){
temp[k++]=a[i++];
}
while (j<=boundPtr){
temp[k++]=a[j++];
}
for(int m=0;m<temp.length;m++) a[leftPtr+m]=temp[m];
}
}
归并排序代码详解
最新推荐文章于 2023-10-05 10:17:37 发布