前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【数据结构与算法面试题】查找最小的k个数

【数据结构与算法面试题】查找最小的k个数

作者头像
felixzhao
发布2021-09-06 10:12:06
3970
发布2021-09-06 10:12:06
举报
文章被收录于专栏:null的专栏
这里写图片描述
这里写图片描述

问题分析:这是一道比较经典的题目,查找最小的k个元素,最简单的方法就是对这n个整数排序,排序完成后,直接输出前k个最小的元素。那么最快的排序方法是快速排序,其算法的时间复杂度为O(nlogn)。是否还存在比这个更快的方法呢?

方法一:利用快速排序的思想,时间复杂度为O(n)

按照某个点将数组划分成左右两部分,左边的数都小于该划分节点,右边的数都大于该划分节点。如果最终该划分节点的位置小于k-1,则在右边节点中继续划分;如果最终该划分节点的位置大于k-1,则在左边节点中继续划分。这个过程直到最终的划分节点的位置正好为k-1。

代码语言:javascript
复制
int swap(int *a, int start, int end, int point_index){
    int par_point = a[point_index];
    while (start < end){
        if (a[start] >= par_point && a[end] <= par_point){
            int tmp = a[start];
            a[start] = a[end];
            a[end] = tmp;
            start ++;
            end --;
        }else if(a[start] < par_point){
            start ++;
        }else{
            end --;
        }
    }
    return start;
}

void get_min_k(int *a, int length, int k){
    if (k > length || NULL == a || length <= 0) return;

    int new_index = swap(a, 0, length-1, k);
    while (true){
        if (new_index == k) break;
        else if (new_index > k){
            new_index = swap(a, 0, new_index, k);
        }else{
            new_index = swap(a, new_index, length-1, k);
        }
    }
}

方法二:利用堆排序,时间复杂度为O(nlogk)

上述方法的缺点是其对数组进行了修改,在堆排序中,可采用小顶堆,其中堆的大小为k,若此时堆的大小小于k时,则将数插入堆中;若此时堆中的大小大于等于k,则比较堆中最大的整数与待插入整数的大小,插入较小的整数。

代码语言:javascript
复制
void get_min_k(int *a, int length, int k, set<int> &s){
    if (k > length || NULL == a || length <= 0) return;

    for (int i = 0; i < length; i++){
        if (s.size() < k){
            s.insert(a[i]);
        }else{
            set<int>::iterator it = --s.end();
            if (a[i] < *it){
                s.erase(*it);
                s.insert(a[i]);
            }
        }
    }
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021/06/15 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档