对两个有序数组进行合并
2016-08-01 18:59
211 查看
问题描述:
数组arr[0...mid-1]和arr[mid..n-1]是各自有序的,对数组arr[0..n-1]的两个有序段进行合并,得到arr[0..n-1]整体。要求空间复杂度为O(1)
eg:{1,3,5,7,2,4,6}合并成{1,2,3,4,5,6,7}
思路:
方法一
很显然,看到这个题目就想到了归并中的合并算法,时间复杂度为O(n),但是很可惜空间复杂度也是O(n)不满足要求。但是还是作为一种解决方案提出来吧,具体实现代码就不列了。
方法二
此外,对于部分有序的我们能想到的是插入排序,但是本题是两段部分有序合并在一起,进行插入排序的话时间复杂度也是O(n2),空间复杂度满足条件。
方法三
本方法的思路有点类似简单排序的,具体思路如下:
遍历数组中下标为0~mid-1的元素,将遍历到的元素的值与arr[mid]比较,若arr[i]大于arr[mid],则交换,即第i次排序,将其最右边的最小的值放到arr[i]的位子上,
然后在后半段中将arr[mid]排序到正常的位置上去。
数组arr[0...mid-1]和arr[mid..n-1]是各自有序的,对数组arr[0..n-1]的两个有序段进行合并,得到arr[0..n-1]整体。要求空间复杂度为O(1)
eg:{1,3,5,7,2,4,6}合并成{1,2,3,4,5,6,7}
思路:
方法一
很显然,看到这个题目就想到了归并中的合并算法,时间复杂度为O(n),但是很可惜空间复杂度也是O(n)不满足要求。但是还是作为一种解决方案提出来吧,具体实现代码就不列了。
方法二
此外,对于部分有序的我们能想到的是插入排序,但是本题是两段部分有序合并在一起,进行插入排序的话时间复杂度也是O(n2),空间复杂度满足条件。
方法三
本方法的思路有点类似简单排序的,具体思路如下:
遍历数组中下标为0~mid-1的元素,将遍历到的元素的值与arr[mid]比较,若arr[i]大于arr[mid],则交换,即第i次排序,将其最右边的最小的值放到arr[i]的位子上,
然后在后半段中将arr[mid]排序到正常的位置上去。
public static void merge(int [] arr,int mid){ int len = arr.length ; int temp ; for(int i = 0 ; i < mid ; i++){ if(arr[i] > arr[mid]){ temp = arr[i] ; arr[i] = arr[mid] ; arr[mid] = arr[i] ; } for(int j = mid + 1 ; j < len ; j++){ if(arr[j] < arr[j-1]){ temp = arr[j] ; arr[j] = arr[j-1] ; arr[j-1] = arr[j] ; }else{ break ; } } }
相关文章推荐
- 两个无序的数组 如何进行合并 为一个有序的数组
- 如何将两个有序的一维数组合并为一个有序的一维数组合
- 将两个排好序的数组,合并到另外一个数组中,并且合并之后的数组也是有序的。
- 两个有序数组合并成一个有序数组
- 两个有序数组合并成一个有序数组
- 1124: 两个有序数组合并
- 两个有序数组的合并排序,Java代码实现,并去重复,考虑空间利用率问题
- 高效合并两个有序数组
- 两个有序数组合并找第k个元素
- MergeSortedArray,合并两个有序的数组
- 两个有序数组合并为一个有序数组
- 两个已排序的数组进行合并
- 两个有序数据合并,不申请新的数组
- 合并两个有序数组并排序
- JAVA合并两个有序数组并去除重复元素。
- 剑指offer面试题4:替换空格和合并两个有序数组
- 1124: 两个有序数组合并
- 将两个排好序的数组,合并到另外一个数组中,并且合并之后的数组也是有序的。
- 如何将两个有序的一维数组合并为一个有序的一维数组合
- 两个有序数组合并,并求中位数(复杂度为O(m+n))