归并排序

来源:互联网 发布:高桥和希 知乎 编辑:程序博客网 时间:2024/06/05 08:25
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));
}
}
原创粉丝点击