import java.util.Arrays;
/**
* 归并排序,空间效率很差,递归进行分解、合并时间复杂度O(nlog2n),稳定的。
* DataWra 可参考其他算法中的
* @author mk
*
*/
public class MergeSort
{
public static void sortMerge(DataWrap[] datas)
{
sort(datas, 0, datas.length - 1);
}
private static void sort(DataWrap[] datas, int left, int right)
{
if (left < right)
{
int midIndex = (left + right) / 2;// 找出中间索引
sort(datas, left, midIndex);// 对左边数组进行递归
sort(datas, midIndex + 1, right);// 对右边数组进行递归
merge(datas, left, midIndex, right);// 合并
}
}
/**
* 将两个数组进行归并,归并前两个数组已经有序,归并后依然有序
*
* @param datas
* 数组对象
* @param left
* 左数组的第一个元素的索引
* @param center
* 左数组的最后一个元素的索引,center+1右数组的第一个元素的索引
* @param right
* 右数组的最后一个元素的索引
*/
private static void merge(DataWrap[] datas, int left, int center, int right)
{
DataWrap[] tmpArr = new DataWrap[datas.length];
int mid = center + 1;
int third = left;// 记录中间数组的索引
int tmp = left;
while (left <= center && mid <= right)
{
//从两个数组中取出小的放入中间数组
if (datas[left].compareTo(datas[mid]) <= 0)
tmpArr[third++] = datas[left++];
else
tmpArr[third++] = datas[mid++];
}
// 剩余部分依次放进中间数组
while (mid <= right)
tmpArr[third++] = datas[mid++];
while (left <= center)
tmpArr[third++] = datas[left++];
while (tmp <= right)// 原left~right范围内的内容被复制回原数组
datas[tmp] = tmpArr[tmp++];
}
public static void main(String[] args)
{
DataWrap[] dws = { new DataWrap(9, ""), new DataWrap(-16, ""),
new DataWrap(21, ""), new DataWrap(23, ""),
new DataWrap(-30, ""), new DataWrap(-49, ""),
new DataWrap(21, ""), new DataWrap(30, ""),
new DataWrap(30, "") };
System.out.println("排序前:" + Arrays.toString(dws));
sortMerge(dws);
System.out.println("排序后:" + Arrays.toString(dws));
}
}
/**
* 归并排序,空间效率很差,递归进行分解、合并时间复杂度O(nlog2n),稳定的。
* DataWra 可参考其他算法中的
* @author mk
*
*/
public class MergeSort
{
public static void sortMerge(DataWrap[] datas)
{
sort(datas, 0, datas.length - 1);
}
private static void sort(DataWrap[] datas, int left, int right)
{
if (left < right)
{
int midIndex = (left + right) / 2;// 找出中间索引
sort(datas, left, midIndex);// 对左边数组进行递归
sort(datas, midIndex + 1, right);// 对右边数组进行递归
merge(datas, left, midIndex, right);// 合并
}
}
/**
* 将两个数组进行归并,归并前两个数组已经有序,归并后依然有序
*
* @param datas
* 数组对象
* @param left
* 左数组的第一个元素的索引
* @param center
* 左数组的最后一个元素的索引,center+1右数组的第一个元素的索引
* @param right
* 右数组的最后一个元素的索引
*/
private static void merge(DataWrap[] datas, int left, int center, int right)
{
DataWrap[] tmpArr = new DataWrap[datas.length];
int mid = center + 1;
int third = left;// 记录中间数组的索引
int tmp = left;
while (left <= center && mid <= right)
{
//从两个数组中取出小的放入中间数组
if (datas[left].compareTo(datas[mid]) <= 0)
tmpArr[third++] = datas[left++];
else
tmpArr[third++] = datas[mid++];
}
// 剩余部分依次放进中间数组
while (mid <= right)
tmpArr[third++] = datas[mid++];
while (left <= center)
tmpArr[third++] = datas[left++];
while (tmp <= right)// 原left~right范围内的内容被复制回原数组
datas[tmp] = tmpArr[tmp++];
}
public static void main(String[] args)
{
DataWrap[] dws = { new DataWrap(9, ""), new DataWrap(-16, ""),
new DataWrap(21, ""), new DataWrap(23, ""),
new DataWrap(-30, ""), new DataWrap(-49, ""),
new DataWrap(21, ""), new DataWrap(30, ""),
new DataWrap(30, "") };
System.out.println("排序前:" + Arrays.toString(dws));
sortMerge(dws);
System.out.println("排序后:" + Arrays.toString(dws));
}
}