归并排序算法,先将数组,递归二分,拆分成一个个有序的数组,然后合并;
/**
* @Descript:归并排序算法
*
* @author LanJonah 2018年2月28日
* @param array
* 需要排序的数组
* @return
*/
private static int[] mergeSort(int array[]) {
if (array == null)
return null;
sortArray(array, 0, array.length - 1);
return array;
}
递归分治:
/**
* @Descript:分组
*
* @author LanJonah 2018年2月28日
* @param array
* 数组
* @param begin
* 要排序的数组起始索引
* @param end
* 要排序的数组结尾索引
*/
private static void sortArray(int[] array, int begin, int end) {
if (begin >= end)
return;
int[] tmp = new int[end-begin+1];
int mid = (begin + end - 1) / 2;
// 递归分治
sortArray(array, begin, mid);
sortArray(array, mid + 1, end);
// 将两个有序数组合并
mergeArray1(array, begin, mid, end,tmp);
}
合并:
比较二个数列的第一个数,谁小就先取谁,取了后放到临时数列。然后再进行比较,如果有数列为空,那直接将另一个数列的数据依次放入临时数组末尾。
/**
* @Descript:将两个有序数组合并
*
* @author LanJonah 2018年2月28日
* @param array
* 数组
* @param begin
* 起始索引
* @param mid
* 中间索引
* @param end
* 结尾索引
* @param tmp
* 临时数组
*/
private static void mergeArray(int[] array, int begin, int mid, int end,int[] tmp) {
int i = begin, j = mid + 1;
int m = mid, n = end;
int k = 0;
while(i<=m&&j<=n){
if(array[i]<= array[j])
tmp[k++] = array[i++];
else
tmp[k++] = array[j++];
}
//当两组数组合并完了之后,如果左边的数组有剩余的值,依次放到临时数组末尾
while(i<=m)
tmp[k++] = array[i++];
while(j<=n)
tmp[k++] = array[j++];
//将临时数组的数据放回原来的数组
for(i=0; i<k;i++ )
array[begin+i] = tmp[i];
System.out.println("过程数组:"+Arrays.toString(tmp));
}
测试:
public static void main(String[] args) {
int[] array = { 5, 1, 2, 13, 7, 8, 9, 11, 4 };
System.out.println("初始结果:" + Arrays.toString(array));
mergeSort(array);
System.out.println("最终结果:" + Arrays.toString(array));
}
运行结果:
初始结果:[5, 1, 2, 13, 7, 8, 9, 11, 4]
过程数组:[1, 5]
过程数组:[2, 13]
过程数组:[1, 2, 5, 13]
过程数组:[7, 8]
过程数组:[4, 11]
过程数组:[4, 9, 11]
过程数组:[4, 7, 8, 9, 11]
过程数组:[1, 2, 4, 5, 7, 8, 9, 11, 13]
最终结果:[1, 2, 4, 5, 7, 8, 9, 11, 13]