归并排序 java_分治算法——归并排序的java实现

本文介绍了归并排序算法的实现,通过MergerSorter类展示了一种基于分治思想的详细步骤,并提供了JUnit测试用例验证其正确性。讨论了分治策略与递归的区别,重点在于归并排序的实际应用。

/**

* 归并操作的实现类

*/

public class MergerSorter {

private static final int[] ARRAY = {2, 5, 10, 30, 60, 40, 5, 6, 66};

public int[] sort(int[] array) {

if (array.length == 1)

return array;

final int dividePos = array.length / 2;

int[] array1 = new int[dividePos];

System.arraycopy(array, 0, array1, 0, array1.length);

int[] array2 = new int[array.length - dividePos];

System.arraycopy(array, dividePos, array2, 0, array2.length);

return merge(sort(array1), sort(array2));

}

public int[] merge(int[] a1, int[] a2) {

int[] result = new int[a1.length + a2.length];

int cursor = 0;

int cursor1 = 0;

int cursor2 = 0;

while (cursor1 < a1.length && cursor2 < a2.length) {

if (a1[cursor1] > a2[cursor2]) {

result[cursor++] = a2[cursor2++];

} else {

result[cursor++] = a1[cursor1++];

}

}

while (cursor1 < a1.length) {

result[cursor++] = a1[cursor1++];

}

while (cursor2 < a2.length) {

result[cursor++] = a2[cursor2++];

}

return result;

}

public static void main(String args[]) {

int[] r = new MergerSorter().sort(ARRAY);

for (int t : r) {

System.out.print(t + ",");

}

}

}

MergerSorterTest.java

import static org.junit.Assert.assertArrayEquals;

import org.junit.After;

import org.junit.Before;

import org.junit.Test;

/**

* TestCase of MergerSorter

*/

public class MergerSorterTest {

private MergerSorter mergerSorter = null;

@Before

public void setUp() throws Exception {

mergerSorter = new MergerSorter();

}

@After

public void tearDown() throws Exception {

mergerSorter = null;

}

@Test

public void merge() {

int[] a1 = {2, 6, 8, 9};

int[] a2 = {5, 8, 10, 12};

int[] expected = {2, 5, 6, 8, 8, 9, 10, 12};

assertArrayEquals(expected, mergerSorter.merge(a1, a2));

}

@Test

public void sort() {

int[] srcArray = {9, 12, 6, 10, 8, 2, 8, 5};

int[] expected = {2, 5, 6, 8, 8, 9, 10, 12};

assertArrayEquals(expected, mergerSorter.sort(srcArray));

}

}

分享到:

18e900b8666ce6f233d25ec02f95ee59.png

72dd548719f0ace4d5f9bca64e1d7715.png

2009-08-05 09:08

浏览 5437

评论

2 楼

luckaway

2009-10-11

ivyloo 写道

分治并没要求小的部分和原问题性质相同,你把分治思想和递归搞混了!

呵呵,这倒没仔细考虑,这里的重点是归并排序的实现。

1 楼

ivyloo

2009-10-10

分治并没要求小的部分和原问题性质相同,你把分治思想和递归搞混了!

源码来自:https://pan.quark.cn/s/a3a3fbe70177 AppBrowser(Application属性查看器,不需要越狱! ! ! ) 不需要越狱,调用私有方法 --- 获取完整的已安装应用列表、打开和删除应用操作、应用运行时相关信息的查看。 支持iOS10.X 注意 目前AppBrowser不支持iOS11应用查看, 由于iOS11目前还处在Beta版, 系统API还没有稳定下来。 等到Private Header更新了iOS11版本,我也会进行更新。 功能 [x] 已安装的应用列表 [x] 应用的详情界面 (打开应用,删除应用,应用的相关信息展示) [x] 应用运行时信息展示(LSApplicationProxy) [ ] 定制喜欢的字段,展示在应用详情界面 介绍 所有已安装应用列表(应用icon+应用名) 为了提供思路,这里只用伪代码,具体的私有代码调用请查看: 获取应用实例: 获取应用名和应用的icon: 应用列表界面展示: 应用列表 应用运行时详情 打开应用: 卸载应用: 获取info.plist文件: 应用运行时详情界面展示: 应用运行时详情 右上角,从左往右第一个按钮用来打开应用;第二个按钮用来卸载这个应用 INFO按钮用来解析并显示出对应的LSApplicationProxy类 树形展示LSApplicationProxy类 通过算法,将LSApplicationProxy类,转换成了字典。 转换规则是:属性名为key,属性值为value,如果value是一个可解析的类(除了NSString,NSNumber...等等)或者是个数组或字典,则继续递归解析。 并且会找到superClass的属性并解析,superClass如...
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值