Java学习手册:(数据结构与算法-数组)如何对数组的两个子有序段进行合并?

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/MaybeForever/article/details/102260300

问题描述:

数组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 

猜你喜欢

转载自blog.csdn.net/MaybeForever/article/details/102260300
今日推荐