/**
* 归并排序算法:将需要排序的数组分成小数组进行归并排序
* Created by hasee on 2017/6/8.
*/
public class Test {
public static void main(String[] args) {
int[] a = {2,1,4,3,6,8,7,9,10,13,12};
mergeSort(a,0,a.length);
for (int i=0; i<a.length; i++){
System.out.println(a[i]);
}
}
public static void mergeSort(int[] a,int p,int r){
if(r-p>2){
//递归调用该方法,将数组分成长度为二的小数组进行逐步归并
mergeSort(a,p,(p+r)/2);
mergeSort(a,(p+r)/2,r);
}
//调用数组的归并方法,对已部分排好序的数组进行排序,最终排序完成。
mergeArray(a,p,(p+r)/2,r);
}
public static void mergeArray(int[] a, int p, int q, int r){
int[] leftArray = Arrays.copyOfRange(a,p,q);
int[] rightArray = Arrays.copyOfRange(a,q,r);
int m = 0;
int n = 0;
for(int i=0; i<leftArray.length + rightArray.length; i++){
//m >= leftArray.length 时表示左数组中所有的元素均被取出,
// 此时将右数组中剩下的元素全部放入a中
if(m >= leftArray.length){
a[i+p] = rightArray[n];
n++;
//n >= rightArray.length 时表示右数组中所有的元素均被取出,
// 此时将左数组中剩下的所有元素放入a中
}else if(n >= rightArray.length){
a[i+p] = leftArray[m];
m++;
//比较左右数组当前最小元素(第一个元素)的大小,将较小的元素放入a中
}else if(leftArray[m] <= rightArray[n]){
a[i+p] = leftArray[m];
m++;
}else {
a[i+p] = rightArray[n];
n++;
}
}
}
}
归并排序
最新推荐文章于 2025-08-11 09:20:14 发布