美文网首页Java
查找第 K 大的数

查找第 K 大的数

作者: 叫我宫城大人 | 来源:发表于2019-04-29 00:20 被阅读0次

题目

查找无序整数数组中第 K 大的元素。

示例

输入:[1, 0, 5, -1, 3, 2, 4], 3

输出:1

解答

冒泡法

采用冒泡排序思想,执行 K 次冒泡,即可得到结果。

public int find(int[] data, int k) {
    for (int i = 0; i < k; i++) {
        for (int j = 0; j < data.length - i - 1; j++) {
            if (data[j + 1] < data[j]) ArrayUtils.swap(data, j + 1, j);
        }
    }
    return data[data.length - k];
}

时间复杂度依赖 K 值大小,最好为 o(n),最坏为 o(n2)。

二分法

采用快排思想,取任意元素二分数组,假设当前位置为 p,则 p 左边的元素全小于 p 元素,右边则全大于。p + 1 则代表该元素在数组中大小的位置。

public int find(int[] data, int p, int q, int k) {
    int left = p, right = q;
    while (p < q) {
        int key = data[p];
        while (p < q && data[q] <= key) q--;
        ArrayUtils.swap(data, left, q);
        while (p < q && data[p] <= key) p++;
        ArrayUtils.swap(data, left, p);
    }
    if (k == p + 1) {
        return data[p];
    } else if (k > p + 1) {
        return find(data, p + 1, right, k);
    } else {
        return find(data, left, p, k);
    }
}

由最外层 n 次遍历,一分为二依次遍历,时间复杂度为 o(n)。

效率

模拟 100w 个无序元素数组,查找第 1k 大的元素;

public static void main(String[] args) {
    long s;

    ArrayFind find = new ArrayFind();
    int k = 1_000;
    int n = 100_0000;
    int[] a = ArrayUtils.initArray(n);

    s = System.currentTimeMillis();
    find.find(a, 0, a.length - 1, k);
    System.out.println("binary cost " + (System.currentTimeMillis() - s));

    int[] b = ArrayUtils.initArray(n);
    s = System.currentTimeMillis();
    find.find(b, k);
    System.out.println("bubble cost " + (System.currentTimeMillis() - s));
}

输出:

binary cost 289
bubble cost 1911

相关文章

  • 查找第 K 大的数

    题目 查找无序整数数组中第 K 大的元素。 示例 输入:[1, 0, 5, -1, 3, 2, 4], 3 输出:...

  • 快排查找第k大的数

    时间复杂度 时间复杂度与二分查找很相似, 都是只找一边. 但是快排不平衡, 且快排需要计算轴心位置. 二分查找的时...

  • Leetcode.215.Kth Largest Element

    题目 给定一个数组, 输出第k大的数. 思路 进行从大到小排序, 第k-1即为第k大的数. 总结 掌握快速排序.

  • LeetCode 215. Kth Largest Elemen

    @(LeetCode) 问题描述 找出数组中第 k 个最大的数。注意是数组排序后第 k 大的数,而不是去重后的第 ...

  • 数组

    第K大的数 第K大的数1.快排:每次返回的是标准的index,当index=k-1时就返回,不是就遍历一边2.堆排...

  • 第四章 函数

    1.在给定的数中从右边查找第K位数字【问题描述】设计一个函数int digit(long n,int k),它返回...

  • 查找第K大的元素

  • 每日一道算法题之-字符串、动态规划、数组

    第 k 大的数Find the kth largest element in an unsorted array....

  • 算法分析 [最大/小值] 2019-02-28

    1. 数组,查找第k大值 215. 数组中的第K个最大元素(元素不重复无序) Kth Largest Elemen...

  • 算法

    大整数乘法 Karatsuba’s Algorithm Select K 从列表中选择第k个最小的数 (...

网友评论

    本文标题:查找第 K 大的数

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