归并排序空间复杂度O(1)的实现
来源:互联网 发布:大数据分析系统架构 编辑:程序博客网 时间:2024/05/21 10:37
正常的归并排序是利用分治法,即分解,解决,合并
//O(n)Membery mergeSort public void mergeSort(int[] nums) { int n = nums.length; helper(nums, 0, n-1); } private void helper(int[] nums1,int b, int e) { if(b < e) { int mid = (b + e) >> 1; helper(nums1, b, mid); helper(nums1, mid+1, e); merge(nums1, b,mid,e); } } void merge(int[] nums1,int b, int m,int e) { int[] nums2 = new int[nums1.length]; int i = b, j = m + 1, k = b; while(i <= m && j <=e) { if(nums1[i] <= nums1[j]){nums2[k++] = nums1[i++];} else nums2[k++] = nums1[j++]; } while(i <= m){nums2[k++] = nums1[i++];} while(j <= e){nums2[k++] = nums1[j++];} for(int ii = b; ii <=e; ii++) { nums1[ii] = nums2[ii]; } }
显然利用临时数组,空间复杂度为O(N)
倘若在merge操作时,可以只使用O(1)的空间。
答案是可以的!!
首先让我们熟悉一下旋转的操作。
旋转:
比如: abcdefg 以d为轴心旋转,得到efgabcd,可以通过如下算法实现。
步骤1:对abcd和efg进行reverse ,得到dcba gfe
步骤2:对整体进行reverse,即得到结果 efg abcd
在merge时:
比如:2468 3578 L1:2468 L2:3578,要将L1和L2合并
步骤:
1、确定3在整体中的位置,即在2和4之间。
2、对 468 3进行上述旋转操作
1、各自reverse 864 3 2、整体reverse 3 468
3、repeat 直至数组越界。
T(n) = 2T(n/2)+O(2n)
O(nlg2n)
2 0
- 归并排序,空间复杂度O(1)的实现
- 归并排序空间复杂度O(1)的实现
- O(1)空间复杂度的归并排序
- O(1)空间复杂度的归并排序
- 在空间复杂度O(1)的条件下实现归并排序[原创]
- 单链表的归并排序:时间复杂度O(nlogn),空间复杂度O(1)
- 百度笔试题之归并排序总结----空间复杂度为O(m+n)的归并排序与空间复杂度为O(1)的归并排序
- 原地归并算法(空间复杂度为O(1)的归并排序)
- 就地归并排序inplacMergeSort,空间复杂度O(1)
- 时间复杂度O(n),空间复杂度O(1)的排序
- 手摇算法(三重翻转算法)和空间复杂度为o(1)的归并排序
- 归并排序的空间复杂度为什么是O(n)?快速排序的空间复杂度为什么是O(log2n)?
- 空间复杂度O(1)的两个有序序列的归并
- 归并排序C实现-空间复杂度O1
- 归并排序及其空间复杂度的思考
- 2012百度暑期实习_空间复杂度为O(1)的排序算法的实现(java)
- 一个时间复杂度为O(n),空间复杂度为O(1)的排序算法
- 排序的时间复杂度为O(n),空间复杂度为O(1)
- PHP命名空间(Namespace)的使用详解
- gperftools编译与使用
- Gradle使用手册(一):为什么要用Gradle?
- 线程池
- ASP.NET 链接MySQL数据库
- 归并排序空间复杂度O(1)的实现
- HDU 1222 Wolf and Rabbit(gcd)
- 实现360手机助手TabHost的波纹效果
- cocos2d-x基础——基本代码框架
- 汇编语言 王爽 第二版 实验15
- 分布式之RPC的协议以及错误处理
- ubuntu 分卷
- Jsp到数据库中文乱码解决方法
- js如何判断客户端类型