算法设计与分析之线性时间选择(C++)

算法设计与分析之线性时间选择
摘要由CSDN通过智能技术生成

线性时间选择算法

  • 模仿快速排序算法
  • 对数组使用分治策略

例题一

问题描述

对于给定的n个元素的数组a[0:n—1],要求从中找出第k小的元素

输入:输入有多组测试例。
 对每一个测试例有2行
 第一行是整数n和k(1≤k<n≤1000)
 第二行是n个整数

输出:第k小的元素

问题分析

我们知道,快速排序算法的一次排序的思想是:
 找到一个数字作为标准,把比该数小的放左边,比该数大的放右边

要找到第k小的元素,最粗暴的就是全部排序,但这样做了很多多余的工作,借鉴快速排序算法的一次排序思想,我们可以以数组首位元素作为一个标准,把小于它的放左边,大于它的放右边:

  • 当这个标准左边的元素和它加起来为k的话,就找到第k小的数了
  • 当这个标准左边的元素和它加起来小于k的话,就向右边继续找第(k-1-该数下标)小的数
  • 当这个标准左边的元素和它加起来大于k的话,就向左边继续找第k小的数

算法实现

#include <iostream>
#include <algorithm>
#define N 100
using namespace std;
//一维数组容器
int a[N];

//线性选择算法寻找第k小的元素
int linearTimeSelection(int,int,int);

int main()
{
   
    int n,k;
    cout<<"输入数组大小:";
    cin>>n;
    if(n>N || n<1) {
   
        cout<<"预留空间不足或数组大小非法!";
        exit(0);
    }

    cout<<"输入数组元素:";
    for(int i=0;i<n;i++) cin>>a[i];

    cout<<"查找第几小的元素:";
    cin>>k;
    if(k > n || k < 1){
   
        cout
  • 4
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值