随机化快排查找第k小元素和随机化查找第k小元素两种方法的比较

SAP UI5 百科全书的目录 笔者 12 年 SAP UI5 开发岁月中写下的 595 篇 SAP UI5 学习笔记,全部收录到《SAP UI5 百科全书》专栏中去,目录如下。请大家按照自己的学习需要,根据关键字搜索到对应的文章,然后进行学习。 阅读详情

随机化快拍查找第k小元素顾名思义是用随机化快排将序列按从小到大排序后找第k小

随机化查找第k小元素思想是在无序序列中随机找一个数为轴,从序列最后一个开始将每个数与轴比较,比轴大的放在数组右面,比轴小的放在数组前面,全部比完后查看轴是第几小的元素(设为m),比较k和m如果相等,则找到第k小元素,如果k<m,取轴前部分在进行以上操作,如果k>m,取轴后半段进行以上操作。

如图:查找第k=3小,a[]一开始存的是要查找的序列,随机取一个数,假如取第四个(注意这里数组从1开始)值为6,那么b[]存比较后各元素,再将b[]中值按位置给相对应的a[]中,此时m=5,k<m。那么将a[]的1~4中选一个,假如选a[]中第二个,值为1,则将a[]中的1~4个以1为轴排并存在b[]中,再将b[]中值按位置给相对应的a[]中,此时m=1。那么将a[]的2~4中选一个,假如选a[]中第2个,值为4,则将a[]中的2~4个以4为轴排并存在b[]中,再将b[]中值按位置给相对应的a[]中,此时m=3,即为找到。

代码:(此代码考虑序列可能有重复值,如1,1,2,那么2是第三小)

#include<stdio.h>

#include<time.h>

#include<stdlib.h>

unsigned long long a[50000000];//带查找序列

unsigned long long b[50000000];//找到轴后分好的序列

void suiji(unsigned long long a[],unsigned long long m,unsigned longlong r)//利用随机化快排查找第k小元素

{

    if(m<r)//快排循环条件,m为数组起始,r数组未结束,每次循环进行一趟快排

    {

            

             unsigned long longtemp=0,p;

             p=rand()%(r-m+1)+m;//随机在数组中找一个数,与待排序列第一个交换

             temp=a[m];

             a[m]=a[p];

             a[p]=temp;

             unsigned long longi=m;

             unsigned long longj=r;

        while(i<j)//i为数组起始,j为数组结束,当i等于j时数组遍历结束

             {

                       while(a[i]<a[j]&&i<j)//a[i]为标兵,当a[i]<a[j]时不交换,j向前移动,直到i>j或a[i]>a[j]时结束

                       {

                                j--;

                       }

                       if(i<j)//此时a[i]>a[j],进行交换,并将i向后移动一个

                       {

                                temp=a[i];

                                a[i]=a[j];

                                a[j]=temp;

                                i++;

                       }

                       while(a[i]<a[j]&&i<j)//a[j]为标兵,当a[i]<a[j]时不交换,i向后移动,直到i>j或a[i]>a[j]

                       {

                                i++;

                       }

                       if(i<j)//此时a[i]>a[j],进行交换,并将j向前移动一个

                       {

                                temp=a[i];

                                a[i]=a[j];

                                a[j]=temp;

                                j--;

                       }

             }

             if(i==j)//此时将已进行完的序列分段在进行随机化快排

             {

                       suiji(a,m,i-1);

                       suiji(a,i+1,r);

             }

    }

}

void chazhao(unsigned long long a[],int l,int r,int k)//利用随机化查找第k小元素

{

    int n=l,m=r,p,i,q=0,v=0;

    p=rand()%(r-l+1)+l;  //随机取数组内的 一个数

    for(i=r;i>=l;i--)//从数组的最后一个开始以轴为标准进行分段

    {

        if(a[i]>a[p])//当数大于轴时,将其移到轴的右边

             {

                       b[m]=a[i];

                       m--;

             }

             elseif(a[i]<a[p]) //当数小于轴时,将其移到轴的左边

             {

                       b[n]=a[i];

                       n++;

             }

             else//当其等于时,记录相等的数的个数

             {

                       q++;

             }

    }

    for(i=n;i<=m;i++)//将数值等于轴的几个数加入到b数组中

    {

             b[i]=a[p];

             n++;

    }

    for(i=l;i<=r;i++)//b数组此时为分好的数列将其赋值给a以便于下一次查找

    {

             a[i]=b[i];

    }

    if((k>=(n-q))&&k<n)//第 k个数值在于其相等的几个数之间,找到第k个数

    {

             printf("随机化查找第k个数是%d\n",a[k]);

    }

    else if(k<(n-q))//第k个数在轴或与轴相同的下标的左边

    {

        r=n-q-1;//将要查找的数列缩短

             chazhao(a,l,r,k); //调用函数进行缩短后的数列的查找

    }

    else if(n<=k)// 第k个数在轴或与轴相同的下标的右边

    {

       l=n; //将要查找的数列缩短

             chazhao(a,l,r,k); //调用函数进行缩短后的数列的查找

    }

}

int main()

{

    int n,i,k;

    printf("请输入数字个数n<=50000000:");

    scanf("%d",&n);

    printf("请输入k:");

    scanf("%d",&k);

    srand(time(NULL));

    for(i=1;i<=n;i++){//随机生成待排数组

        a[i]=rand();

    }

    clock_t beg,end;//起始时间和结束时间

    double time;

    beg=clock();

    suiji(a,1,n);

    printf("随机化快排查找第k个元素是%d\n",a[k]);

    end=clock();

    time=(double)(end-beg)/CLOCKS_PER_SEC;

    printf("随机产生成数进行随机快排查找第k小元素的运行时间:%f s\n",time);

    beg=clock();

    chazhao(a,1,n,k);

    end=clock();

    time=(double)(end-beg)/CLOCKS_PER_SEC;

    printf("随机产生成数进行随机化查找第k小元素的运行时间:%f s\n",time);

    return 0;

}



毕设助力!从0到1构建基于YOLO的家居安防异常活动监测系统,让你的毕设守护家庭安全 做完这个项目,你会发现自己完整走过了“数据采集→标注→模型训练→功能集成→界面开发”的毕设全流程,这不仅是技术能力的证明,更是对“技术守护生活”这一理念的实践。答辩时,你可以重点讲这几点:系统解决了家居安防的哪些痛点、对比了不同YOLO模型的性能差异、系统未来能怎么优化(比如对接智能门锁/报警器、实现语音交互)。未来,这个系统还能往“更智能”的方向发展:比如结合行为分析判断异常意图、开发移动端APP实现全屋设备联动、在智慧社区中实现多家庭联防……想象空间很大。 阅读详情

相关推荐

VBA解决Excel批处理任务之:批量修改Sheet名称

针对需要批量处理大量的Sheet改名的场景,使用VBA是非常便捷的方式。 简单介绍几种方法: 1. 录制宏法: 录制宏是用Excel自带的工具把改名改成一个可以复制操作的动作。 这里选择录制,会弹出一个宏设置窗口: 这里设置好宏名称就好,然后确定就可以开始录制你的操作。操作完成之后,再进入到宏窗口点击结束录制: 这样就可以通过执行来运行了,运行方法: 1. 通过选择宏: ...

跬步至千里 1万+

Python 实现快速排序和随机快速排序

直接上代码: #快速排序 #coding: utf-8 def quicksort(a,left,right): if(left<right): mid = partition(a,left,right) quicksort(a,left,mid-1) quicksort(a,mid+1,right) def...

weixin_30251587的博客 713

智能车竞赛新手必看:单车定向组直线竞速与八字慢速实战技巧

本文为智能车竞赛新手提供单车定向组直线竞速与八字慢速的实战技巧,涵盖赛道分析、动力调校、传感器配置等关键环节。通过真实案例和代码示例,详细讲解如何平衡速度与稳定性,帮助选手避免常见失误,提升比赛成绩。特别针对智能车竞赛中的直线竞速和八字慢速项目,提供从硬件选型到临场策略的全方位指导。

weixin_28718793的博客 434

快速排序以及找到第k小的元素

快速排序使用分治的思想,对子数组A[p..r]进行快速排序,分3步: 1. 分解:将数组A[p..r]划分成两个子数组A[p ..q-1]和A[ q+1,..,r],使得A[p ..q-1]中的每一个元素均小于等于A[q], A[ q+1,..,r]中的每个元素均大于等于A[q]。 2. 解决:对子数组A[p,..,q-1]和A[q+1,..,r]进行排序 3. 合并:因为快速排序是原址排

liuchenjane的博客 3386

vos如何对接okcc(保姆级教程)

1.添加账户 点击 系统->账户管理 [图片] 2.创建费率 系统->费率管理 点击添加

qq_46333281的博客 3453

高通Camera PDAF调试实战:从Type2到Type3的避坑指南与Log分析技巧

本文深入解析高通Camera平台PDAF调试实战,重点对比Type2与Type3的核心差异,提供详细的配置迁移方案和Log分析技巧。针对常见兼容性问题如对焦速度变慢、低光失效等,给出具体解决方案,并分享性能优化案例与高级调试工具链,帮助开发者快速提升PDAF调试效率。

weixin_29164185的博客 411

top-K问题和随机选择算法

之前聊过top-K问题,有朋友反馈说,如果内存能容纳下这N个元素,那么使用堆处理top-K问题,并不是最佳算法。确实如此,在本文中,我们来循序渐进地看下top-K问题的处理思路:1.快速排序算法;2.直接选择算法;3.堆选择算法;4.随机选择算法。

认知 行动 坚持 2818

1014. 福尔摩斯的约会 (20)-PAT乙级真题

1014. 福尔摩斯的约会 (20) 大侦探福尔摩斯接到一张奇怪的字条:“我们约会吧!3485djDkxh4hhGE 2984akDfkkkkggEdsb s&hgsfdk d&Hyscvnm”。大侦探很快就明白了,字条上奇怪的乱码实际上就是约会的时间“星期四 14:04”,因为前面两字符串中第1对相同的大写英文字母(大小写有区分)是第4个字母’D’,代表星期四;第2对相同的字符是’

柳婼 の blog 2645

顺序查找和随机查找的区别?

随机查找:查找的次序是不固定的,如二叉树排序树,b和b+数,二分查找,通过比对可能下一个查找的位置在左子树,也可能在右子树。顺序查找:查找的次序是固定,如顺序表,从0-n-1的一个一个比对。

qq_55720359的博客 3728

CPD (Coherent Point Drift) 算法实现点云配准 C++版

作为和icp并列的点集配准算法cpd为什么没有icp火,等我把整个方案跑完才明白。 首先下载cpd https://github.com/gadomski/cpd 包含的fgt https://github.com/gadomski/fgt 下载到win10的解压后 运行cmake来进行编译 这个时候会提醒缺少eigen3 fgt python 这几个都安装排除后 在build文件夹下会生成vs2017的源码,右键全部生成后在 .\cpd-master\build\Debug 下会生成一个cpd.li

uranus1992的博客 3510

Open3D 机载点云电力线提取【2025最新版】

传统方法实现的机载点云电力线分割提取。博客长期更新,本文最新更新时间为:2025年3月23日。

点云侠的博客 4468

随机快排查找第k小元素和随机化查找第k小元素

随机化查找第k小元素:不必将所有元素按从大到小或从小到大排序即可找出第k小值 思路:随机从序列中取一值,从第一个值开始,将比起小的放在左面,比起大的放在右面。然后比较k与这个值的位置(数组下角标,我设置成从1开始的)如果k的值比这个值的下角标大,那么取这个值的右半部分(都比这个值小)然后再从其中取以随机值,进行如上操作,直到这个值的下角标与k相等为止。如果k的值比这个值的下角标小,那么取这个值的...

yang03_26的博客 697

109. SAP ABAP 应用程序中的锁机制和工作原理介绍

SAP ABAP 系统中的锁概念,是 SAP ABAP 为了保证`数据一致性`而引入的一种保护机制。 像 SAP 这种复杂的企业级应用,系统中同一时间段的同一份数据,可能会有多个 Transaction(终端用户或者 API )同时进行读写操作。为了防止出现数据不一致,SAP ABAP 引入了锁机制。 这种锁机制并非数据库服务器层面的锁,而是在 SAP ABAP 应用服务器层面上工作,加锁和解锁都由专门的 ABAP Function Module 来完成。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1468

找第k小元素

1.分治法 算法思想 1.分解: 使用Random Partition对数组array进行划分 2.解决 对主元素i分析,若i等于k,则返回该位置;若i&amp;amp;lt;k,说明第k小元素落在数组的array[i+1 …n]之中,递归分析数组array[i+1 …n]的第k-i小元素;若i&amp;amp;gt;k,说明第k小元素落在数组的array[0 …i-1]之中,递归分析数组array[0 …i-1]的第k小元素 ...

karin_0的博客 1983

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

算法随笔(快排,随机快排,归并排序,找中位数, 第k小元素问题 ,棋盘覆盖)

快速排序 import java.util.Scanner; public class Main { public static void change(int a[],int p,int q) { int t; t=a[p]; a[p]=a[q]; a[q]=t; } public static int ...

qq_45353823的博客 1024

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

快速排序思想求结构体中第 k 小元素

首先,我们需要定义Node结构体,并告诉计算机什么叫“小”。int x, y;// 重载 < 运算符// 规则:先比 x,x 一样才比 yif (x!

notionjiao的博客 620

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

【4】快排及随机化算法

快排(Quicksort) 分治算法 原地排序(就在原来的数据区域内进行重排,像插入排序,在原来的区域完成排序,归并排序额外的空间进行排序) 分治 分,快速排序将数据划分为几份,所以快排通过选取一个关键数据,再根据它的大小把原数据分为两个子数组(第一个数组的元素都比这个主元素小,第一个数组的元素都比这个主元素大或相等) 治,用递归处理两个子数组的排序 合并,连接 (A,p,q)(A,p,...

Jimmyzqb的博客 4028

分治法查找 第k小元素

#include<bits/stdc++.h> using namespace std; int Partition(int a[], int left, int right) { //一次快排 int pivot = a[left]; while (left < right) { while (left<right && a[right]>pivot) { right--; } a[left] = a[right]; whil.

Cap07博客 634

随机伪快排法 求第k大数

分治法求第K大数 利用快排的思想求一个数列的第k大数, 高二开始写快排,但是一直没有非常清晰的理解,知道是分治, 但不理解细节。 今天借助写这个的机会,同时阅读了《编程珠玑》里的四种快排写法,才感觉更加清晰了。 这次写的快排才真正有了一个数,其左边的数都比他小, 右边的都比他大。 /****************************************************

执米之手,与米偕老 1376

快速排序_查找第k小元素

快速排序_查找第k小元素 以下代码可以从数组a[]中找出第k小的元素。 它使用了类似快速排序中的分治算法,期望时间复杂度是O(N)的。 请仔细阅读分析源码,填写划线部分缺失的内容。 一个问题,快排你的开始位置不一定就是你最后i = j的位置,无法确定第一次定下来的元素是哪一个。 所以只能判断当前定下来的元素和k的关系,如果定下来的i在k的左边,那就从i+1到r进行快排,寻找第k-i大的元素(左边的都比i小,i号元素又比k号元素小,所以是k-i) 如果定下来的在k的右边,那就从l到i-1找第k大..

ZERO的博客 1801

线性时间内找到第k小的元素:快排应用与BFPRT算法

目录问题分析快排应用BFPRT算法 问题分析 面对这个问题,最简单的想法是对数据进行排序,然后根据下标即可找到第k小的元素,目前已知的排序算法的最低时间复杂度为O(nlog⁡2log⁡2n)O(n\sqrt{\log_2 {\log_2 n}})O(nlog2​log2​n​),但并不为人熟知。目前应用最广的排序算法的最低时间复杂度为O(nlog⁡2n)O(n\log_2 n)O(nlog2​n)。 但是,作为完美主义者的程序员,需要思考,找到第k小的元素一定需要排序吗?但除了寻找最大或最小的元素之外,我们

RealCoder的博客 1022

快速排序 确定主元以及随机化 三路快排

快速排序时间复杂度为O(nlogn),由于每次主元所在次序并不一定是在数列中央,所以复杂度并不是确定的。 特殊的,当原数组排序程度越高的时候,快速排序时间复杂度会退化,当原数组完全有序时,快速排序时间复杂度退化成O(n^2) 确定主元排序: #include<bits/stdc++.h> using namespace std; const int maxn = ...

老铁,干了这碗algorithms的博客 757

算法导论:4 快排及随机化算法

1 快速排序 1.1 快速排序原理 快速排序算法采用的分治算法,因此对一个子数组进行快速排序的三个步骤为: (1)分解:数组被划分为两个(可能为空)子数组]和,给定一个枢轴,使得中的每个元素小于等于,中的每个元素大于等于,下标是在划分过程中计算得出的。 (2)解决:通过递归调用快速排序,对子数组和进行排序。 (3)合并:因为两个子数组是就地排序,不需要合并操作,整个数组排序完成。 快速排序伪...

chaojianmo的博客 1137

LeetCode 215 Kth Largest Element in an Array 含有各种快排对比

题目:Find the kth largest element in an unsorted array. Note that it is the kth largest element in the sorted order, not the kth distinct element. For example, Given [3,2,1,5,6,4] and k = 2, return 5.

老夫编代码就是一把梭 738

随机化快排找第k大的值215

在未排序的数组中找到第 k 个最大的元素。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。 示例 1: 输入: [3,2,1,5,6,4] 和 k = 2 输出: 5 示例 2: 输入: [3,2,3,1,2,4,5,5,6] 和 k = 4 输出: 4 说明: 你可以假设 k 总是有效的,且 1 ≤ k ≤ 数组的长度。 3 2 1 5 6 4 随机3为前驱 ...

qq_42964711的博客 367

从零开始刷算法——快排的运用-使用快速排序查找第 K 大元素(随机化枢轴优化)

leetcode215查找第k大的元素,快排的做法。

m0_59624833的博客 424
上一篇: JAVA编写的小型日历
下一篇: c语言 顺序查找与二分查找
yang03_26
博客等级 码龄8年 51粉丝 51原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值