C++改进的选择算法SELECT2

排序算法研究之选择排序(select sort) /* bubble sort */ # include<iostream> using namespace std; void selectsort(int[], int); int main() { int array [] = {55,2,6,4,32,12,9,73,26,37}; int len = sizeof(array) / sizeof(int); ... 阅读详情

余祥宣, 崔国华, 邹海明. 计算机算法基础.3版[M]. 华中科技大学出版社, 2006.
P96 算法4.17

#include<iostream>
#include<time.h>
#include<windows.h>
using namespace std;

const int r=5;//步长

void InterChange(int&a, int&b)
{
    int temp = a;
    a = b;
    b = temp;
}

void InsertionSort(int A[], int start, int end)
{
    for (int j = start + 1; j <= end; j++)
    {
        int item = A[j];
        int i = j - 1;
        while (i>=start&&item < A[i])
        {
            A[i + 1] = A[i];
            i--;
        }
        A[i + 1]  = item;
    }
}

int Partition(int A[], int m, int p)//A[p+1]=无穷大
{
    int i, v;
    v = A[m];
    i = m;
    while (true)
    {
        do
        {
            i = i + 1;
        } while (A[i] < v);

        do
        {
            p = p - 1;
        } while (A[p] > v);

        if (i < p)
        {
            InterChange(A[i], A[p]);
        }
        else
        {
            break;
        }
    }
    A[m] = A[p];
    A[p] = v;
    return p;
}

void ShowList(int A[], int length=12)
{
    for (int i = 0; i<length; i++)
        cout << i << "=>" << A[i] << "\t";
    cout << endl;
}

int SEL(int A[],int m,int p,int k)
{
    int n, i, j;

    while (true)
    {
        n = p - m + 1;

        if (p - m + 1 <= r)
        {
            InsertionSort(A, m, p);
            return m + k - 1;
        }

        int nr_down = n / r;// n/r向下取整

        for (i = 1; i <= nr_down; i++)
        {
            InsertionSort(A, m + (i - 1)*r, m + i*r - 1);
            InterChange(A[m + i - 1], A[m + (i - 1)*r + (r + 2 - 1) / 2 - 1]);//中间值应该是r/2向上取整
        }

        //向上取整(a+b-1)/b
        //A[m,m+1,……,m+nr_down - 1]取中值即长度/2向上取整
        j = SEL(A, m, m + nr_down - 1, (nr_down + 2 - 1) / 2);

        //使用Partition(A,m,j)要做出调整
        InterChange(A[m], A[j]);
        j = p + 1;
        int temp = A[p + 1];
        A[j] = INT_MAX;
        j=Partition(A,m,j);
        A[p + 1] = temp; 

        if (j - m + 1 == k)
        { 
            return j;
        }           
        else if (j - m + 1 > k)
            p = j - 1;
        else
        {
            k = k - (j - m + 1);
            m = j + 1;
        }

    }
}

int main()
{
    const int len = 10;//数据量
    int a[len];
    int b[len];
    srand((unsigned)time(NULL));
    for (int i = 0; i < len; i++)
        a[i]=b[i] = rand()%100000+1;

    DWORD start, end;

    int index = rand() % len+ 1;//索引位置
    int key = 0;

    start = GetTickCount();
    key = SEL(a, 0, len-1,index);
    start = GetTickCount();
    cout << "Time:" << end - start << endl;

    ShowList(a, len);
    cout << endl <<" a["<<key<<"]"<<a[key]<<endl;

    start = GetTickCount();
    InsertionSort(b, 0, len - 1);
    start = GetTickCount();
    cout << "Time:" << end - start << endl;

    ShowList(b, len);
    cout << endl << " b[" << index-1 << "]" << a[index-1];

    system("pause");
    return 0;
}

运行结果
C++改进的选择算法SELECT2运行结果

线性时间选择算法实战:从RandomizedSelect到Select的C++实现(含完整代码与复杂度解析) 本文深入解析了线性时间选择算法,从基于随机化的RandomizedSelect到保证最坏情况性能的Select算法,提供了完整的C++实现与复杂度分析。文章通过生活化类比和逐行注释的代码,帮助读者掌握在无序数组中高效查找第k小元素的核心技巧,并对比了两种算法的适用场景与C++标准库的最佳实践。 阅读详情

相关推荐

C++ 选择排序算法的实现与改进(含笔试面试题)

选择排序(Selection sort)也是一种最简单直观的排序算法。 算法步骤 1)首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置 2)再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。 3)重复第二步,直到所有元素均排序完毕。、 实现代码: /************************************

MISAYAONE的博客 2661

C++经典算法题-排序法 - 改良的选择排序

36.排序法 - 改良的选择排序 说明 选择排序法的概念简单,每次从未排序部份选一最小值,插入已排序部份的后端,其时间主要花费于在整个未排序部份寻找最小值,如果能让搜寻最小值的方式加 快,选择排序法的速率也就可以加快,Heap排序法让搜寻的路径由树根至最后一个树叶,而不是整个未排序部份,因而称之为改良的选择排序法。 解法 Heap排序法使用Heap Tree(堆积树),树是一种资料结构,而堆积树是...

逍遥云恋 804

winpcap无法安装提示新版本已经安装解决办法

问题显示如下该问题会导致ensp里的云识别不到网卡可能是因为之前安装了npcap,而且安装时勾选了第四个选项导致无法安装,需要完全卸载npcap解决办法:办法一:在控制面板的程序与卸载里面卸载npcap和winPcap,然后再安装winPcap,如果搜不到往下看办法二:在C:\Windows\SysWOW64目录下搜索wpcap.dll和packet.dll并重命名为wpcap.dll.old和packet.dll.old办法三:如果搜不到这两个文件需要安装win10Pcap才能找到这两个文件下载地址:Wi

qq_73202377的博客 3万+

最坏情况为线性时间的选择算法(SELECT)

在最坏情况下,时间复杂度为线性时间的选择算法,算法思想来源于算法导论第九章。

weixin_52565796的博客 2840

从数据到图片:手把手构建FMCW雷达人体行为识别数据集(行走、跌倒、喝水等6类动作)

本文详细解析了如何利用FMCW雷达构建人体行为识别数据集,涵盖行走、跌倒、喝水等6类动作。通过多普勒特征可视化、图像标准化处理和自动化流水线设计,将原始雷达信号转化为高质量时频图像数据集,为智能家居和健康监护等应用提供可靠数据支持。

weixin_30706691的博客 385

3小时学会AI建站!无需编程,个人简历独立站开发速成指南

3小时学会AI建站!个人简历独立站开发速成指南

pei_laoshi的博客 1261

算法导论05--SELECT算法与随机选择算法

一、目的 1.熟悉算法设计的基本思想 2.掌握随机选择算法(rand select)的方法 3.掌握选择算法(SELECT)的方法 二、内容与设计思想 编写随机整数生成算法,生成S到T范围内的N个随机整数并输出; 编写随机选择算法和SELECT算法; 随机生成1e2、1e3、1e4、1e5、1e6个数,使用随机选择算法和SELECT算法找到第0.5N大的数输出,并画图描述不同情况下的运行时间差异; 随机生成1e6个数,使用随机选择算法和SELECT算法找到第0.2N、0.4N、0.6N、0.8N大的数输出

张嘉睿的博客 1412

OpenEuler22.04 快速部署Docker:华为云镜像源配置指南

本文详细介绍了在OpenEuler 22.04系统上快速部署Docker的完整流程。针对系统默认源版本老旧的问题,重点讲解了如何配置华为云镜像源以加速安装,并涵盖Docker引擎、Docker Compose的安装、服务启动验证、权限配置、镜像加速等核心步骤与常见问题排查,帮助用户高效搭建稳定的容器化开发环境。

http9protocoller的博客 174

十四、第三章再续:快速选择SELECT算法的深入分析与实现

十四、亦第三章再续:快速选择SELECT算法的深入分析与实现作者:July。出处:http://blog.youkuaiyun.com/v_JULY_v  。  前言    经典算法研究系列已经写了十三个算法,共计22篇文章(详情,见这:十三个经典算法研究与总结、目录+索引),我很怕我自己不再把这个算法系列给继续写下去了。沉思良久,到底是不想因为要创作狂想曲系列而耽搁这个经典算法研究系列,何况它,至今反响还不

结构之法 算法之道 5万+

手把手教你用Matlab为PMSM电流环设计2P2Z补偿器(附与PI对比)

本文详细介绍了如何使用Matlab的controlSystemDesigner工具为永磁同步电机(PMSM)电流环设计2P2Z补偿器,并与传统PI控制器进行性能对比。通过频域分析和时域仿真,展示了2P2Z补偿器在提升带宽、减少超调等方面的优势,为高性能伺服驱动和精密运动控制提供了实用解决方案。

weixin_42551227的博客 380

Debian 12 安装nodejs(包括node、npm、npx、yarn、pnpm、cnpm、bun)

【代码】Debian 12 安装nodejs。

mirana的专栏 8017

快速选择算法Quick Select Algorithm(Java和C++代码实现)

what is Quick select? 快速选择是一种从无序列表找到第k小元素的选择算法。它从原理上来说与快速排序有关。同样地,它在实际应用是一种高效的算法,具有很好的平均时间复杂度,然而最坏时间复杂度则不理想。 快速选择及其变种是实际应用中最常使用的高效选择算法。 总体而言,Quick select采用和Quick sort类似的步骤。首先选定一个pivot,然后根据每个数字与该pivo...

zpznba的博客 3155

Vue2 - 详细实现解析Markdown内容生成侧边栏Toc目录索引,识别文章内容根据大标题/小标题自动生成多级文章目录,点击目录导航时跳转到文章内容对应的锚点位置带过渡动画,滑过锚点时高亮对应标题

vue2,nuxt2,Markdown,目录,文章目录锚点,滚动高亮导航文字,根据页面滚动高亮显示目录的侧边栏,自动提取标题生成右侧目录,vuemarkdown解析并生成目录,滚动页面的时候文章目录跟着选中效果,侧边栏滚动跟随页面,右边目录固定,左边内容可以滚动并且与左边目录联动,实现监听滚动,锚点定位,文章目录滚动跟随高亮,右边菜单点击目录滚动到对应标题,报错,渲染失败,文章内容,读取#标题符号,自动生成一个目录树,自动生成Toc目录,博客内容生成目录索引,资讯文章,生成锚点目录树TOC,详细示例代码教

🏆 前端领域优质创作者 3670

线性时间选择算法实战:从RandomizedSelect到Select的C++实现(附完整代码与复杂度解析)

本文深入解析了线性时间选择算法,对比了基于随机化的RandomizedSelect与确定性BFPRT(Select)算法的C++实现。通过完整代码示例和复杂度分析,阐述了前者平均O(n)的快速实践与后者最坏情况O(n)的理论保证,并提供了基于实际场景的算法选型策略与优化建议。

p1q2r的博客 965

VHDL六层电梯控制器及仿真

六层电梯电梯 设计要求:设计一个六层电梯控制系统要求有超载、关门中断、提前关门清除报警信电梯外人的上升请求信号,电梯外人的下降请求信号, 电梯外人上升请求信号显示电梯外人下降请求信号显示到达楼层信号 设计思路:输入有clk时钟信号(频率为2Hz) full,deng,quick,clr超载、关门中断、提前关门清除报警c_u1,c_u2,c_u3,c_u4,c_u5电梯外人的上升请求c_d2,c_d3,c_d4,c_d5,c_d6 电梯外人的下降请求 d1,d2,d3,d4,d5,d6电梯内人的...

QQ_778132974的博客 1709

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

image2cpp终极指南:如何将图片快速转换为OLED显示屏字节数组

image2cpp是一款简单高效的工具,能够将图片快速转换为适用于OLED等单色显示屏的字节数组,也能将字节数组还原为图片,特别适合Arduino或树莓派等嵌入式项目开发。本文将详细介绍如何使用这款工具,让你轻松掌握图片到字节数组的转换技巧。 ## 为什么选择image2cpp? 在开发嵌入式项目时,将图片显示在OLED屏幕上是常见需求。传统方法往往需要依赖Windows软件,操作繁琐且结果不

gitblog_00453的博客 930

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Select 选择算法 - 编程珠玑(续) 笔记

Select 算法 I 编程珠玑(续)介绍的 Quickselect 算法 选择 N 个元素中的第 K 小(大)值,是日常场景中常见的问题,也是经典的算法问题. 选取 N 个元素的数组的中的第 K 小(大)值,最简单的想法是将数组排序后直接选取. 那么这种方法的时间复杂度是O(N log N). C.A.R.Hoare 提出的 Quickelect 算法的平均时间复杂度达到了 O(N) . 在去递...

weixin_30544657的博客 239

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

算法:线性时间选择(C/C++)

Description 给定线性序集中n个元素和一个整数k,n<=2000000,1<=k<=n,要求找出这n个元素中第k小的数。 Input 第一行有两个正整数n,k. 接下来是n个整数(0<=ai<=1e9)。 Output 输出第k小的数 Sample Input 6 3 1 3 5 2 4 6 Sample Output 3 利用快速排序可以找出第k小的,加上随机函数改进一下: AC代码: #include <cstdio> #include <c

yanhua_tj的博客 8478

快速选择SELECT算法实现

#include    #include   using namespace std; typedef int Data;   #define SWAP(x,y)  {Data t=x;x=y;y=t;}   const static int num_array = 14; // 快速选择,平均时间复杂度O(N) int quickSelect( Data* A, int

qisefengzheng的专栏 总有一天你将破蛹而出 736

十大经典算法之一:选择排序(Select-Sort)

1. 算法步骤 首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置。 再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。 重复第二步,直到所有元素均排序完毕。 2.C/C++代码 /*The Author: Smile Position: Algorithm Engineer */ #include <iostream> using namespac...

weixin_42615026的博客 431

选择(select)排序算法

直接排序是不稳定的排序。 1、直接排序算法的基本思想 n个记录的直接选择排序可经过n-1趟直接选择排序得到有序结果。 (1) 初始状态:无序区为A[1...n],有序区为空。 (2) 第一趟排序:在无序区A[1...n]中选出最小的记录A[k],将他与无序区的第一个记录A[1]交换,使A[1...1]和A[2...n]分别变为记录个数增加1的新有序区和记录个数减少1的新无序区。 (3)第

J8121的博客 1134

选择性搜索(Select Search)

候选区域(Region Proposal)算法 滑窗法的问题可以使用候选区域产生算法解决。这些算法输入整张图片,然后输出可能有物体的候选区域位置,这些候选区域可以有噪声或者重叠,或者和物体的重合度不是很好,这都不要紧,只要这些区域里有一个和实际物体的位置足够接近就行。因为不好的候选区域会被物体识别算法过滤掉。 候选区域算法用分割不同区域的办法来识别潜在的物体。在分割的时候,我们要合并那些...

haohaomua的博客 3430

数据架构与算法——C/C++实现选择排序(Selection sort)算法【建议收藏】

一、选择排序介绍 选择排序(Selection sort)是一种简单直观的排序算法。 它的基本思想是:首先在未排序的数列中找到最小(or最大)元素,然后将其存放到数列的起始位置;接着,再从剩余未排序的元素中继续寻找最小(or最大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。 二、选择排序图文说明 选择排序代码 /* * 选择排序 * * 参数说明: * a -- 待排序的数组 * n -- 数组的长度 */ void select_sort(int a[],

嵌入式Linux内核的博客 499

Gemma 2本地部署实战:三步跑通llama.cpp轻量推理

大语言模型本地化部署是当前AI工程落地的核心能力之一,其本质是将开源模型在消费级硬件上实现低门槛、低延迟、高可控的推理服务。关键技术路径围绕模型量化(如GGUF格式)、轻量推理引擎(如llama.cpp)与系统级优化(CPU/GPU协同、内存管理)展开。Gemma 2作为谷歌推出的高性能开源模型,凭借Apache 2.0许可、原生GGUF支持及与llama.cpp的高度兼容性,成为入门本地部署的理想载体。它无需依赖云API、规避数据外泄风险,适用于学生实验、企业内网合规场景及隐私敏感型应用。本文聚焦Gemm

dianqi0560的博客 505

无需安装!image2cpp在线工具让Arduino OLED开发效率提升10倍

image2cpp是一款免费开源的在线工具,专为Arduino和树莓派等嵌入式设备的OLED屏幕开发设计,能将图片快速转换为字节数组,也支持将字节数组还原为图像预览。所有处理均在本地浏览器完成,无需安装软件,让开发者告别繁琐的手动编码,显著提升开发效率。 ## 🌟 为什么选择image2cpp? 对于Arduino OLED开发者来说,将图片转换为显示所需的字节数组曾经是一个耗时且容易出错的

gitblog_00961的博客 472
上一篇: C++快速分类算法
下一篇: C++带有期限和效益的单位时间的作业排序贪心算法JS
小英雄Dui
博客等级 码龄11年 37粉丝 41原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值