package com.mindle.test.sort;
import java.util.Arrays;
public class MergeSort<AnyType extends Comparable<? super AnyType>> {
public void mergeSort(AnyType[] array) {
AnyType[] tmpArray = (AnyType[]) new Comparable[array.length]; // 缓存数组
mergeSort(array, tmpArray, 0, array.length - 1);
}
/**
* 递归调用的归并排序,分而治之:分成左右两半,分别排序后,再合并
*
* @param array
* 目标数组
* @param tmpArray
* 缓存数组
* @param left
* 数组头
* @param right
* 数组尾
*/
private void mergeSort(AnyType[] array, AnyType[] tmpArray, int left, int right) {
// 一个元素时不用排序
if (left < right) {
int mid = (left + right) / 2;
mergeSort(array, tmpArray, left, mid);
mergeSort(array, tmpArray, mid + 1, right);
merge(array, tmpArray, left, mid + 1, right);
}
}
/**
* 将两个排好序的数组合并成一个有序数组
*
* @param array
* 目标数组
* @param tmpArray
* 缓存数组
* @param leftPos
* 第一个数组头
* @param rightPos
* 第二个数组头
* @param rightEnd
* 第二个数组尾
*/
private void merge(AnyType[] array, AnyType[] tmpArray, int leftPos, int rightPos, int rightEnd) {
int leftEnd = rightPos - 1;
int tmpPos = leftPos;
int num = rightEnd - leftPos + 1;
while (leftPos <= leftEnd && rightPos <= rightEnd) {
if (array[leftPos].compareTo(array[rightPos]) < 0)
tmpArray[tmpPos++] = array[leftPos++];
else
tmpArray[tmpPos++] = array[rightPos++];
}
while (rightPos <= rightEnd) {
tmpArray[tmpPos++] = array[rightPos++];
}
while (leftPos <= leftEnd) {
tmpArray[tmpPos++] = array[leftPos++];
}
// 复制回数组
for (int i = 0; i < num; i++, rightEnd--)
array[rightEnd] = tmpArray[rightEnd];
}
// test
public static void main(String[] args) {
Integer[] array = { 34, 8, 64, 51, 32, 21, 25, 58, 78, 1, 5, 12, 2, 34, 8, 64, 51, 32, 21, 25, 58, 78, 1, 5, 12,
2, 34, 8, 64, 51, 32, 21, 25, 58, 78, 1, 5, 12, 2 };
System.out.println(Arrays.toString(array));
new MergeSort<Integer>().mergeSort(array);
System.out.println(Arrays.toString(array));
}
}
Java数据结构与算法:归并排序
猜你喜欢
转载自blog.csdn.net/weixin_40255793/article/details/79594851
今日推荐
周排行