1. 程式人生 > >尋找兩個已排序陣列的中位數

尋找兩個已排序陣列的中位數

給定兩個大小為 m 和 n 的有序陣列 nums1 和 nums2 

請找出這兩個有序陣列的中位數。要求演算法的時間複雜度為 O(log (m+n)) 。

nums1 = [1, 3]
nums2 = [2]

中位數是 2.0
nums1 = [1, 2]
nums2 = [3, 4]

中位數是 (2 + 3)/2 = 2.5

class Solution {
    public double findMedianSortedArrays(int[] nums1, int[] nums2) {
        int nums1L = nums1.length;
		int nums2L = nums2.length;
		double result = 0;
		int i = 0, j = 0, k = 0;
		int[] num = new int[nums1L + nums2L];
		while(i < nums1L && j < nums2L){
			if(nums1[i] < nums2[j]) num[k++] = nums1[i++];
			else num[k++] = nums2[j++];
		}
		while(i == nums1L && j < nums2L){
			num[k++] = nums2[j++];
		}
		while(i < nums1L && j == nums2L){
			num[k++] = nums1[i++];
		}
		if(num.length % 2 == 0){
			result = ((double)(num[num.length / 2] + num[num.length / 2 -1]))/2; 
		} 
		else{
			result = (double)(num[num.length / 2]);
		}
		return result;
    }
}

思路:歸併排序


效率分析:

可以說合並排序是比較複雜的排序,特別是對於不瞭解分治法基本思想的同學來說可能難以理解。總時間=分解時間+解決問題時間+合併時間。分解時間就是把一個待排序序列分解成兩序列,時間為一常數,時間複雜度o(1).解決問題時間是兩個遞迴式,把一個規模為n的問題分成兩個規模分別為n/2的子問題,時間為2T(n/2).合併時間複雜度為o(n)。總時間T(n)=2T(n/2)+o(n).這個遞迴式可以用遞迴樹來解,其解是o(nlogn).此外在最壞、最佳、平均情況下歸併排序時間複雜度均為o(nlogn).從合併過程中可以看出合併排序穩定。 

用遞迴樹的方法解遞迴式T(n)=2T(n/2)+o(n):假設解決最後的子問題用時為常數c,則對於n個待排序記錄來說整個問題的規模為cn。

從這個遞迴樹可以看出,第一層時間代價為cn,第二層時間代價為cn/2+cn/2=cn.....每一層代價都是cn,總共有logn+1層。所以總的時間代價為cn*(logn+1).時間複雜度是o(nlogn).