public class MergeSort {
/**
* 归并排序,归并array[l,r]
* @param array
* @param l
* @param r
*/
public static void mergeSort(int array[] ,int l,int r){
if(l>=r){
return ;
}
int mid = (l+r)/2;
//双路归并
mergeSort(array, l, mid);
mergeSort(array, mid+1, r);
//归并,使array[l,mid]与array[mid+1,r]两部分合并为一个有序的数组:array[l,r]
merge(array,l,mid,r);
}
/**
* 合并有序数组array[l,mid]与array[mid+1,r]为一个有序的数组:array[l,r]
* @param array
* @param l
* @param mid
* @param r
*/
private static void merge(int[] array, int l, int mid, int r) {
//暂存待合并的数组aux[0,r]=array[l,r];
int[] aux = Arrays.copyOfRange(array, l, r+1);
int i=l,j=mid+1;//两个有序数组的起始值分别为i,j
//对array的[l,r]重新赋值,形成有序数组
for(int k=l;k<=r;k++){
//第一个有序数组的元素已经全部在array里排好,将第二个数组的元素全部依次赋值
if(i>mid){
array[k]=aux[j-l];j++;
}else if(j>r){//第二个有序数组array[mid+1,r]的元素已经全部在array里排好,将第一个数组的元素全部依次赋值
array[k]=aux[i-l];i++;
}else if(aux[i-l]<aux[j-l]){//将两个有序数组中小的值重新赋值给对应的array[k]
array[k]=aux[i-l];i++;
}else{
array[k]=aux[j-l];j++;
}
}
}
public static void main(String[] args) {
int[] array = new int [10];
for(int i=0;i<10;i++){
array[i]=(int)(Math.random()*10);
}
mergeSort(array, 0, array.length-1);
System.out.println(Arrays.toString(array));
}
}
3.归并排序Java实现
猜你喜欢
转载自blog.csdn.net/cl723401/article/details/88103584
今日推荐
周排行