归并排序
来源:互联网 发布:高桥和希 知乎 编辑:程序博客网 时间: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));
}
}
/**
* 归并排序,空间效率很差,递归进行分解、合并时间复杂度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));
}
}
- 归并排序-归并排序
- 归并和归并排序
- 归并与归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 排序::归并
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- jQuery参考实例 1.17 使用$别名而又不引起冲突
- JSP开发引用MyDate97插件
- ANDROID入门2:在Ubuntu上为Android系统内置C可执行程序测试Linux内核驱动程序
- PowerPC DTS 移植
- 使用 GetOleDbSchemaTable 和 Visual C# .NET 检索架构信息
- 归并排序
- struts2 s select
- 重写equal 的同时为什么必须重写hashcode?
- 编译Coco2d-x android 程序出现make: *** No rule to make target ...CCConfiguration.o'. Stop.
- ANDROID入门3:在Ubuntu上为Android访问Linux内核驱动程序编写硬件抽象层(HAL)模块
- Qt教程一 —— 第六章:组装丰富的积木!
- C#数据类型转换中隐式转换要注意的几点
- Git 中文教程
- Google 图片搜索算法