Lc4-寻找两个有序数组的中位数

/*
 * 给定两个大小为 m 和 n 的有序数组 nums1 和 nums2。

请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n))。

你可以假设 nums1 和 nums2 不会同时为空。

示例 1:

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

则中位数是 2.0
示例 2:

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

则中位数是 (2 + 3)/2 = 2.5

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/median-of-two-sorted-arrays
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
 */
public class Lc4 {
    /*
     * ·1:确定俩个数组总个数是奇数还是偶数,为了确定中位数计算方式 ·2:找到中位数的位置
     */
    public static double findMedianSortedArrays(int[] nums1, int[] nums2) {
        // ·确定俩个数组总个数是奇数还是偶数
        boolean isEven = false;
        int sum = nums1.length + nums2.length;
        if ((sum) % 2 == 0) {
            isEven = true;
        }
        // ·合并俩个数组并进行排序
        int[] nums = new int[sum];
        for (int i = 0; i < nums1.length; i++) {
            nums[i] = nums1[i];
        }
        for (int i = 0; i < nums2.length; i++) {
            nums[nums1.length + i] = nums2[i];
        }

        shellSort(nums);

        // ·偶数
        if (isEven) {
            int x = sum / 2 - 1;
            int y = x + 1;
            return (double) (nums[x] + nums[y]) / 2;

            // ·奇数
        } else {
            int x = sum / 2 + 1 - 1;
            return (double) nums[x];
        }
    }

    // ·希尔排序: 在直接插入排序的基础上增加控制增量,逻辑上将数组分组,轮流对每一个数组排序
    //nlong(n)
    public static int[] shellSort(int[] nums) {
        for (int gap = nums.length / 2; gap > 0; gap /= 2) {
            for (int i = gap; i < nums.length; i++) {
                for (int j = i; j >= gap && nums[j] < nums[j - gap]; j -= gap) {
                    int temp = nums[j];
                    nums[j] = nums[j - gap];
                    nums[j - gap] = temp;
                }
            }
        }
        return nums;
    }

    public static void main(String[] args) {
        int[] nums1 = { 1, 2 };
        int[] nums2 = { 3, 4 };
        System.out.println(findMedianSortedArrays(nums1, nums2));
        System.out.println();
//
//        int[] nums = { 1, 2, 4, 5, 3 };
//        System.out.println(shellSort(nums));
//        System.out.println();
    }
}
posted @ 2020-01-03 10:55  小傻孩丶儿  阅读(164)  评论(0编辑  收藏  举报