算法练习-归并排序
2016-05-05 19:31
162 查看
归并排序
定义
将两个有序对数组归并成一个更大的有序数组。通常做法为递归排序,并将两个不同的有序数组归并到第三个数组中。复杂度
每一层排序进行N次比较,总共有logN层,时间复杂度: O(NlogN)因为使用了数组同等大小的辅助空间,空间复杂度:O(N)
代码
public class SortMethod { public static void merge(int[] arr) { merge(arr, 0, arr.length - 1); } private static void merge(int[] arr, int start, int end) { if (end <= start) { return; } int mid = (end - start) / 2 + start; merge(arr, start, mid); merge(arr, mid + 1, end); mergeSort(arr, start, mid, end); } private static void mergeSort(int[] arr, int start, int mid, int end) { int[] helper = new int[arr.length]; for (int k = start; k < end; k++) { helper[k] = arr[k]; } int i = start, j = mid; for (int k = start; k <= end; k++) { if (i > mid) { arr[k] = helper[j]; j++; } else if (j > end) { arr[k] = helper[i]; i++; } else if (helper[i] < helper[j]) { arr[k] = helper[i]; i++; } else { arr[k] = helper[j]; j++; } } } }
测试代码:
public class TestSort extends TestCase { public void testMerge() { int[] arr = { 5, 3, 2, 1, 10, 5, 23 }; int[] correct = { 1, 2, 3, 5, 5, 10, 23 }; SortMethod.merge(arr); for (int i = 0; i < arr.length; i++) { assertEquals(arr[i], correct[i]); } } }
相关文章推荐
- leetcode 206 Reverse Linked List C++
- HDU 3466 Proud Merchants (01背包)
- 4. Median of Two Sorted Arrays
- MMDrawerController,最简代码实现抽屉效果
- 标准C++中的string类的用法总结
- http报文格式和post, get方式区别与误区(很不错哦)
- 匈牙利算法解决指派问题清晰流程
- android设计模式——建造者模式
- 将空格用%20替换
- 优先队列+括号配对 51Nod1476 括号序列的最小代价
- 线程间通信:生产者消费者(等待唤醒机制)
- 使用Unity3D 自主实战开发的赛车游戏实例,关键点记录 (六)之自动寻路及优化
- 浅谈锚链接(native 嵌套 h5)
- 程序员必读书单
- 实验一:认识树莓派
- JVM工作原理
- Win10太高端,如何连接XP / Win7 共享出来的打印机?
- CSS 颜色代码 qt
- swift实现ios类似微信输入框跟随键盘弹出的效果
- Exercise(12):纸牌均分