算法思想:归并排序是用递归和分治方法将数据序列划分为越来越小的半子表,再对半子表排序,最后再用递归方法将排好序的半子表合并为越来越大的有序序列。
package com.haobi;
/*
* 归并排序
*/
public class MergeSort {
public static void merge(int[] array,int p,int q,int r) {//p-左边位置;q-中间点;r-右边位置;
int i,j,k;//循环所用到的参数
int n1 = q-p+1;//n1-左边数组的长度
int n2 = r-q;//n2-右边数组的长度
int[] L = new int[n1];//L[]-左边数组
int[] R = new int[n2];//R[]-右边数组
for(i=0,k=p;i<n1;i++,k++) {//在数组中进行循环,将左数组对应的值赋值给左数组
L[i] = array[k];
}
for(i=0,k=q+1;i<n2;i++,k++) {//在数组中进行循环,将右数组对应的值赋值给右数组
R[i] = array[k];
}
for(k=p,i=0,j=0;i<n1&&j<n2;k++) {//同时对左右数组进行操作,当(i<n1&&j<n2)条件不满足时跳出循环
if(L[i]<R[j]) {//如果左数组元素小于右数组元素
array[k] = L[i];//左数组元素存进数组
i++;
}else {//左数组元素大于右数组
array[k] = R[j];//右数组元素存进数组
j++;
}
if(i<n1) {//i<n1,则说明左数组有剩余(右数组遍历完成),即剩下数组中的元素依次存入数组尾部
for(j=i;j<n1;j++,k++) {
array[k] = L[j];
}
}
if(j<n2) {////j<n2,则说明右数组有剩余(左数组遍历完成),即剩下数组中的元素依次存入数组尾部
for(i=j;i<n2;i++,k++) {
array[k] = R[i];
}
}
}
}
public static void mergeSort(int[] array, int p,int r) {
if(p<r) {
int q = (p+r)/2;//设置q为p和r的中间点
mergeSort(array,p,q);//左半部分进行归并排序
mergeSort(array,q+1,r);//右半部分进行归并排序
merge(array,p,q,r);//对排好序的半子表进行合并
}
}
public static void main(String[] args) {
int[] array = {19,13,5,27,1,26,31,16};
mergeSort(array,0,array.length-1);
for(int i=0;i<array.length;i++) {
System.out.print(array[i]+" ");
}
}
}
程序输出结果如下:
1 5 13 19 26 27 31