美文网首页
算法-求无序数组的中位数(快速排序)

算法-求无序数组的中位数(快速排序)

作者: zzq_nene | 来源:发表于2020-07-27 23:35 被阅读0次

中位数,就是数组排序后处于数组最中间的那个元素。如果数组长度是奇数,最中间就是位置为(n+1)/2的那个元素;如果数组长度是偶数,中位数就是位置n/2和位置为n/2+1的两个元素的和除以2的结果。

    /**
     * 基于快速排序查找中位数
     * 定义一个key,一般取数组最右边的元素为key,然后再定义两个变量start和end
     * start为首元素索引,end为尾元素索引
     * 然后从后往前找,找到第一个比key小的元素,没找到则end--,找到则将当前start位置的元素值置为当前end位置的元素值
     * 然后再start++
     * 接着再从前往后找,找到第一个比key大的元素,没找到则start++,找到则将当前end位置的元素值置为当前start位置的元素值
     * 最后当start==end的时候,将当前start位置的元素值置为key
     * 接着递归调用,按当前start==end的位置,分成两半
     * 左边到start-1,右边从start+1开始
     *
     * @param array
     * @param left
     * @param right
     */
    private static void quickSortSearchMedian(int[] array, int left, int right) {
        if (left < 0) {
            return;
        }
        if (right >= array.length) {
            return;
        }
        if (left >= right) {
            return ;
        }
        int key = array[left];
        int start = left;
        int end = right;
        while (start < end) {
            // 从右边往左边找,找到第一个小于key的值,则索引--
            while (start < end && array[end] >= key) {
                end--;
            }
            if (start < end) {
                array[start] = array[end];
                start++;
            }
            // 从左边往右边找,找到第一个大于key的值,则索引++
            while (start < end && array[start] <= key) {
                start++;
            }
            if (start < end) {
                array[end] = array[start];
                end--;
            }
        }
        // start == end
        array[start] = key;
        quickSortSearchMedian(array, left, start - 1);
        quickSortSearchMedian(array, start + 1, right);
    }

    /**
     * 求中位数
     * 如果数组长度为奇数,则是第(n+1)/2个,即下标为(n+1)/2-1
     * 如果数组长度为偶数,则是第n/2和n/2+1个之和除以2,即下标为n/2-1和n/2的两个数的和除以2
     * @param array
     */
    public static void searchMedian(int[] array) {
        quickSortSearchMedian(array, 0, array.length - 1);
        if ((array.length % 2) == 0) {
            int i = array[array.length/2-1];
            int j = array[array.length/2];
            System.out.println((i+j)/2.0);
        } else {
            System.out.println(array[(array.length + 1) / 2 - 1]);
        }
    }

相关文章

  • 10-6 求无序数组中的中位数算法

    求无序数组中的中位数算法

  • 算法-求无序数组的中位数(快速排序)

    中位数,就是数组排序后处于数组最中间的那个元素。如果数组长度是奇数,最中间就是位置为(n+1)/2的那个元素;如果...

  • 手撕代码 之 快速排序

    1.实现快速排序算法 问题描述给定一个无序数组int[ ] a,使用快速排序算法进行排序。 解题思路对于快速排序,...

  • 算法

    字符串反转 链表反转 有序数组合并 Hash算法 查找两个子视图的共同父视图 求无序数组中的中位数

  • 2018 iOS面试题---算法相关

    字符串反转 链表反转 有序数组合并 Hash算法 查找两个子视图的共同父视图 求无序数组当中的中位数 一、字符串反...

  • 算法相关

    字符串反转 链表反转 有序数组合并 Hash算法 查找两个子视图的共同父视图 求无序数组当中的中位数 一、字符串反...

  • 算法相关

    字符串反转 链表反转 有序数组合并 Hash算法 查找两个子视图的共同父视图 求无序数组当中的中位数 一、字符串反...

  • Median of medians无序数组寻找中位数最差O(n)

    在无序数组中寻找中位数,最差复杂度为O(n). 实现算法为Median of medians,又叫BFPRT算法。...

  • PHP排序算法

    排序算法 冒泡排序(数组排序) 快速排序(数组排序) 参考 http://www.cnblogs.com/enia...

  • 冒泡排序(bubble sort)

    冒泡排序也叫起泡排序,一般用于对无序数组进行排序;同时冒泡算法属于稳定排序,也具备原地算法特征 假设给定一个无序数...

网友评论

      本文标题:算法-求无序数组的中位数(快速排序)

      本文链接:https://www.haomeiwen.com/subject/vjxxrktx.html