版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
问题描述:
数组a[0,mid-1]和a[mid,n-1]是各自有序的,对数组a[0,n-1]的两个子有序段进行合并,得到a[0,n-1]整体有序。要求空间复杂度为O(1)。假设给定数组a={1,5,6,7,9,2,4,8,10,13,14},mid=5,a[0]-a[4]是有序的,a[5]-a[10]是有序的,合并后的数组为{1,2,4,5,6,7,8,9,10,13,14}。
方法一:
由于限制空间复杂度O(1) ,最容易想到的是插入排序方法,这种方法时间复杂度为O(n^2),空间复杂度为O(1)。
方法二:
首先,遍历数组中下标为0~mid-1的元素,将遍历的元素与a[mid]进行比较,如果满足a[mid] < a[i],则将两者交换,接着在后半数组中找a[mid]的相对位置。直至遍历结束,数组变为有序。
方法二代码如下:
package com.haobi;
public class Test26 {
public static void main(String[] args) {
int a[] = {1,5,6,7,9,2,4,8,10,13,14};
sort(a, 5);
for(int i=0;i<a.length;i++) {
System.out.print(a[i]+" ");
}
}
public static void sort(int[] a, int mid) {
int temp;
for(int i=0;i<=mid-1;i++) {
//如果分隔元素小于前半数组中的某个元素,则交换
if(a[mid] < a[i]) {
temp = a[i];
a[i] = a[mid];
a[mid] = temp;
//在后半数组中寻找分隔元素的相对位置
findRightPlaceForMid(a, mid);
}
}
}
public static void findRightPlaceForMid(int[] a, int mid) {
int len = a.length;
int temp;
//for循环查找mid的最终位置
for(int i=mid;i<len-1;i++) {
if(a[i+1]<a[i]) {
temp = a[i];
a[i] = a[i+1];
a[i+1] = temp;
}
}
}
}
程序输结果如下:
1 2 4 5 6 7 8 9 10 13 14