归并排序非递归实现Java
2017-06-22 15:23
246 查看
递归实现的归并排序,需要O(lgN)的栈空间,而非递归实现的归并排序则不需要
原文地址:http://www.jianshu.com/p/39dd1d9b491d
原文地址:http://www.jianshu.com/p/39dd1d9b491d
public class Sort { public static void MergeSort2(int[] arr) { //使用非递归的方式来实现归并排序 int len = arr.length; int k = 1; while(k < len) { MergePass(arr, k, len); k *= 2; } } //MergePass方法负责将数组中的相邻的有k个元素的字序列进行归并 private static void MergePass(int[] arr, int k, int n) { int i = 0; int j; //从前往后,将2个长度为k的子序列合并为1个 while(i < n - 2*k + 1) { merge(arr, i, i + k-1, i + 2*k - 1); i += 2*k; } //这段代码保证了,将那些“落单的”长度不足两两merge的部分和前面merge起来。 if(i < n - k ) { merge(arr, i, i+k-1, n-1); } } //merge函数实际上是将两个有序数组合并成一个有序数组 //因为数组有序,合并很简单,只要维护几个指针就可以了 private static void merge(int[] arr, int low, int mid, int high) { //temp数组用于暂存合并的结果 int[] temp = new int[high - low + 1]; //左半边的指针 int i = low; //右半边的指针 int j = mid+1; //合并后数组的指针 int k = 0; //将记录由小到大地放进temp数组 for(; i <= mid && j <= high; k++) { if(arr[i] < arr[j]) temp[k] = arr[i++]; else temp[k] = arr[j++]; } //接下来两个while循环是为了将剩余的(比另一边多出来的个数)放到temp数组中 while(i <= mid) temp[k++] = arr[i++]; while(j <= high) temp[k++] = arr[j++]; //将temp数组中的元素写入到待排数组中 for(int l = 0; l < temp.length; l++) arr[low + l] = temp[l]; } }
相关文章推荐
- 递归和迭代两种方式实现归并排序(Java版)
- 归并排序 Java实现(递归试)
- 归并排序的递归与非递归实现java
- 归并排序(Merge Sort)递归、非递归 Java实现
- Shell、归并排序、递归的java实现
- 递归思想详解以及归并排序(java实现)
- 归并排序的递归与非递归实现理解(Java)
- 归并排序 C++/Java 递归实现代码 -犯了菜鸟老毛病
- 改进归并排序消除递归Java实现
- 用递归的方式实现文件内容搜索(java)
- Java实现折半查找(二分查找)的递归和非递归算法
- java实现的归并排序
- 【转】排序算法复习(Java实现) (二): 归并排序,堆排序,桶式排序,基数排序
- java语言实现的二叉树的各种操作(包括递归与非递归遍历二叉树,求二叉树的高度,节点总数,叶子节点等)
- java 递归实现二叉树
- 【转】排序算法复习(Java实现)(二): 归并排序,堆排序,桶式排序,基数排序
- 归并排序Java实现
- 排序算法复习(Java实现)(二): 归并排序,堆排序,桶式排序,基数排序
- 归并排序递归实现C语言
- Java实现折半查找(二分查找)的递归和非递归算法