C++---快速选择(每日一道算法2023.4.8)

这篇具有很好参考价值的文章主要介绍了C++---快速选择(每日一道算法2023.4.8)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

注意事项:
快速排序的一个拓展算法,建议先了解快排:快速排序—前后双指针法

题目:
给一个未排序的数列,列表中不包含重复元素,要求找到第k大的元素并输出。

输入格式
第一行两个整数,n,k,用空格隔开,分别表示序列长度和需要找到第k大的元素。
第二行有n个元素,用空格隔开,是序列中的所有元素。

输出格式
单个字符,输出序列中第k大的元素。

数据范围
0 < n < 10000;

输入:
10 6
5 3 2 1 4 7 6 9 8 10
输出:
6
#include <cstring>
#include <cmath>
#include <iostream>
#include <algorithm>
using namespace std;

const int N = 10010;
int x[N];
int n, k;

int quick_select(int a[], int l, int r, int k) {
    if (l >= r) {return a[k];}

    int mid = a[(l+r)/2], i = l-1, j = r+1;
    while (i < j) {
        while (a[++i] < mid);
        while (a[--j] > mid);
        if (i < j) swap(a[i], a[j]);
    }

    if (j >= k) {return quick_select(a, l, j, k);}
    else {return quick_select(a, j+1, r, k);}
}

int main() {
    cin >> n >> k;
    for (int i = 0; i<n; i++) cin >> x[i];
    cout << quick_select(x, 0, 9, k-1) << endl;
}

思路:
和二分查找各有优势

1.二分查找用于在已排序的序列中查找给定值的元素。时间复杂度:O(log n)。
优势:对于已排序的序列,二分查找非常高效,因为每次迭代都会将搜索范围缩小一半。

2.快速选择用于在未排序的序列中查找第k小(或第k大)的元素。
优势:对于未排序的序列,快速选择能够高效地找到第k小(或第k大)的元素,而不需要对整个序列进行排序。

如果有所帮助请给个免费的赞吧~有人看才是支撑我写下去的动力!

ps: 前几天在忙着期中考试和各种赶due,明天不出意外应该会恢复更新的,今天水一道吧哎嘿

声明:
算法思路来源为y总,详细请见https://www.acwing.com/
本文仅用作学习记录和交流文章来源地址https://www.toymoban.com/news/detail-411512.html

到了这里,关于C++---快速选择(每日一道算法2023.4.8)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C++---区间DP---加分二叉树(每日一道算法2023.4.28)

    题目: 设一个 n 个节点的二叉树 tree 的中序遍历为(1,2,3,…,n),其中数字 1,2,3,…,n 为节点编号。 每个节点都有一个分数(均为正整数),记第 i 个节点的分数为 di,tree 及它的每个子树都有一个加分,任一棵子树 subtree(也包含 tree 本身)的加分计算方法如下: subtree的左

    2024年02月06日
    浏览(31)
  • C++---最长上升子序列模型---最大上升子序列和(每日一道算法2023.3.3)

    注意事项: 本题为\\\"线性dp—最长上升子序列的长度\\\"的扩展题,所以dp思路这里就不再赘述。 题目: 比如,对于序列(1,7,3,5,9,4,8),有它的一些上升子序列,如(1,7),(3,4,8)等。 这些子序列中和最大为18,为子序列(1,3,5,9)的和。 你的任务,就是对于给定的序列,求出最大上升子序

    2024年02月03日
    浏览(36)
  • 每日一道算法题 1

    借鉴文章:Java-敏感字段加密 - 哔哩哔哩 题目描述  给定一个由多个命令字组成的命令字符串; 1、字符串长度小于等于127字节,只包含大小写字母,数字,下划线和偶数个双引号 2、命令字之间以一个或多个下划线_进行分割 3、可以通过两个双引号\\\"\\\"来标识包含下划线_的命令

    2024年02月04日
    浏览(35)
  • 每日一道面试题之什么是反射?

    反射是一种自我观察的能力,在程序运行时,对任意一个类,我们可通过 class、constructor、field、method 四个方法获取该类的各个组成部分,在java程序运行时,对任意类,我们都可通过该类了解到其包含哪些属性和方法,这种 动态获取当前类对象的信息以及动态调用对象方法的

    2024年02月08日
    浏览(47)
  • 每日一道面试题之介绍一下Iterator

    Iterator是Java中的一个接口 , 用于遍历集合(Collection)中的元素 。通过Iterator,可以 按顺序访问集合中的每个元素 ,而无需了解集合的内部实现细节。 通过调用集合的 iterator()方法获取Iterator对象 。例如: 使用 while循环和hasNext()方法判断是否还有下一个元素 。例如: 使用

    2024年02月15日
    浏览(32)
  • 每日一道编程题:计算2的N次方

    任意给定一个正整数N(N=100),计算2的n次方的值。 输入一个正整数N。 输出2的N次方的值。

    2024年01月23日
    浏览(36)
  • 力扣每日一道系列 --- LeetCode 160. 相交链表

    📷 江池俊: 个人主页 🔥个人专栏: ✅数据结构探索 ✅LeetCode每日一道 🌅 有航道的人,再渺小也不会迷途。 LeetCode 160. 相交链表 思路: 首先计算两个链表的长度,然后判断两个链表的尾节点是否相同。如果不同,那么这两个链表就没有交集,返回空;如果相同,那么就

    2024年02月05日
    浏览(32)
  • 力扣每日一道系列 --- LeetCode 206. 反转链表

    📷 江池俊: 个人主页 🔥个人专栏: ✅数据结构探索 ✅LeetCode每日一道 🌅 有航道的人,再渺小也不会迷途。 LeetCode 206. 反转链表 初始化两个指针, cur 和 newhead 。 cur 指向给定的链表头节点, newhead 初始为 NULL 。 在 cur 不为空的情况下,执行循环。 首先,记录下 cur 的下

    2024年02月04日
    浏览(37)
  • 力扣每日一道系列 --- LeetCode 88. 合并两个有序数组

    📷 江池俊: 个人主页 🔥个人专栏: ✅数据结构探索 ✅LeetCode每日一道 🌅 有航道的人,再渺小也不会迷途。 LeetCode 88. 合并两个有序数组 首先创建一个临时数组,其大小为第一个数组的大小(即nums1Size),其作用主要是。 通过循环遍历两个数组,将两个数组元素比较后较

    2024年02月04日
    浏览(48)
  • 每日一道面试题之list和set有什么区别?

    List和Set 是 Java集合框架中的两个接口 ,虽然它们都继承自Collection接口,但在使用上有一些区别。 有序性 : List是有序的集合 ,它 按照元素的插入顺序进行存储和访问 。可以 通过索引来访问List中的元素 。而 Set是无序的集合 ,它不保证元素的顺序,也 不能通过索引来访问

    2024年02月16日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包