2020.08.02算法笔记,快速排序之中位数

106 阅读1分钟

查找一个无序数组的中位数

 public static void main(String[] args) {
        int[] nums = {7, 1,2, 3, 8,9,10};
        int res = getMedian(nums);
        System.out.println(res);
    }

    public static int getMedian(int[] nums) {
        return partition(nums, 0, nums.length - 1);
    }

    private static int partition(int[] nums, int start, int end) {
        /***快排partition函数原代码——start***/
        int left = start;
        int right = end;

        int point = nums[start];
        while (left < right) {
            
            while (left < right && nums[right] >= point) {
                right--;
            }

            //循环完之后,left 所在位置,的元素比point 要小
            while (left < right && nums[left] <= point) {
                left++;
            }
            if (left < right) {
                int tmp = nums[left];
                nums[left] = nums[right];
                nums[right] = tmp;
            }
        }
       
        //循环完之后leftright 的元素
        //leftright 的值相同。
        //并 nums[left] 肯定是小于 point 的取值的。
        nums[start] = nums[left];
        nums[left] = point;
        /***快排partition函数原代码——end***/

        /***定位判断***/
        根据不同的 标准,可以设置不同的中位数
        if (left == (nums.length - 1) / 2) {
            return nums[left];
        } else if (left > (nums.length - 1) / 2) {
            return partition(nums, start, left - 1);
        } else {
            return partition(nums, left + 1, end);
        }
    }