package com.sort;
import java.util.Random;
public class RandomSelect {
public static int randomSelect(int [] data,int p,int r,int i){
if(p==r){
return data[p];
}
int q=partition(data,p,r);
int k=q-p+1;
if(i==k){
return data[q];
}else if(i<k){
return randomSelect(data,p,q-1,i);
}else{
return randomSelect(data,q+1,r,i-k);
}
}
private static int partition(int []data ,int p,int r){
int random=new Random().nextInt(r-p)+p;
int tmpR=data[random];
data[random]=data[r];
data[r]=tmpR;
int x=data[r];
int i=p-1;
for(int j=p;j<=r-1;j++){
if(data[j]<=x){
i=i+1;
int tmp=data[i];
data[i]=data[j];
data[j]=tmp;
}
}
int tmp=data[i+1];
data[i+1]=data[r];
data[r]=tmp;
return i+1;
}
public static void main(String[] args) {
int [] data=new int[]{1,8,3,7,5,4,2,9};
for(int i=0;i<data.length;i++){
System.out.print(data[i]+" ");
}
System.out.println();
int select=randomSelect(data,0,data.length-1,4);
System.out.println(select);
}
}
相关推荐
【python】epub的电子书繁体字与简体字转换
中文繁体与简体转换
基于快速排序的快速选择
#include #include #include #define MAXSIZE 100#define CUTOFF 3//#define SELECTNUM 24 //当要求选特定的第K个时,可使用#definetypedef int elemtype;void Swap(elemtype *,elemtype *);void InsertSort(e
C++常见面试题总结
C++常见面试题总结
选择算法(基于快速排序修改):选择第i小的值
1、选择最大最小值: a)选择最大或最小值,可以遍历数组所有元素,在线性时间O(n)内完成。 代码: int findmax(int* A,int N) { int max = A[0]; int tmp; for(int i = 1;i<N;i++){ tmp = A[i]; if(tmp>max){ max = tmp; } } return max; } b)...
一个大屏掌握港口全部信息的数字孪生技术
智慧港口就是通过整合港口全部数据,将数据通过iot设备与大屏连接,再通过自研3D渲染引擎模拟港口全貌,打造智慧港口大屏,整个系统分为四个模块,分别为港口概览、环境监测、设备运维和安防管理,各个模块独立运行,分别展示港口不同信息,各个模块的数据通过山海鲸内置数据源接口与港口管理系统进行对接。数据源支持实时刷新,模块内容支持自定义修改和定制化开发。接下来带大家详细了解一下各模块情况。
手把手教你用手机号注册的Apple ID成功登录Developer账户(避坑指南)
本文详细解析了使用手机号注册的Apple ID登录开发者账户时常见的'不符合使用条件'报错问题,并提供了从添加可验证邮箱到设置主账号的四步解决方案。特别针对Apple Developer账户的验证机制,帮助开发者避免因邮箱缺失导致的登录失败,提升账户激活成功率。
基于快速排序思想的三个算法题
一,最小的k个数 输入n个数,找出其中最小的k个数,例如输入4,5,1,6,2,7,3,8,个数字,则最小的数字是1,2,3,4 基于O(n)的算法,可以用基于Partion函数解决这个问题,如果基于数组的第k个数字来调整,使得比第k个数字小的所有数字都位于数组的左边,比第k个数组大的所有数字都位于数组的右边,这样调整之后数组左边的k个数字就是最小的k个数字,不一定有序 import jav
离线安装PlutoSDR硬件支持包全攻略:没有MathWorks账号也能搞定MATLAB集成
本文详细介绍了在没有MathWorks账号和网络环境的情况下,如何离线安装PlutoSDR硬件支持包并实现MATLAB集成的完整解决方案。从驱动安装、设备识别到MATLAB支持包的离线部署,提供了全面的步骤指导和常见问题排查方法,特别适合高校实验室、军工单位等内网环境使用。
快速排序与快速选择
快速排序算法就是将一列无序的数字排成有序,通过使用分治法,快速排序能够在O(nlog(n))的时间内完成,相比堆排序等其他也是O(nlog(n))复杂度的排序算法,快速排序的基数更小,因此效率也就越高。快速选择是在快速排序的基础上,在一列无序数中快速地计算出第K大的数字,同样使用分治法。快速选择可以避免许多不必要的排序工作。以下是快速排序的算法实现:快速排序通过a<b,b<c则a &l...
海康SDK实战:如何从PS流中提取H264裸流并实现前端播放(附完整代码)
本文详细介绍了如何利用海康SDK从PS流中提取H264裸流,并构建无插件前端播放的完整链路。通过解析PS流结构、提取H264 ES流,结合WebSocket实时传输与WFS.js前端播放器,实现了低延迟、高可控性的视频流处理方案,为开发者提供了从数据源到前端渲染的实战代码与清晰指南。
数字电路逻辑与设计实验三 译码器和数据选择器
1. 译码器功能测试 将 74LS139 按图 3.1 接线,按表 3.2 输入电平分别置位,填输出状态表。 2. 译码器转换 将双 2-4 线译码器转换为 3-8 线译码器。 (1)画出转换电路图。 (2)在实验箱上接线并验证设计是否正确。 (3)设计并填表写该 3-8 线译码器功能表,画出输入、输出波形。 3. 数据选择器的测试及应用 (1) 将双 4 选 1 数据选择器 74LS153 参照图 3.2 接线,测试其功能并填写功能表 3.3。 (2)将实验箱脉冲信号源中固定连续脉冲 4 个不
快速排序的基本原理及实现
原理: 快速排序使用分而治之来获得与归并排序相同的优点,而不使用额外的存储。快速排序首先选择一个值,称为枢轴值,一般选择使用列表的第一项作为枢轴值。它的作用是帮助拆分列表。枢轴值属于最终排序列表的实际位置,将用于将列表划分为快速排序的后续调用。分区从通过列表中剩余项目的开始和结束处定位两个位置标记。 代码实现: ...
循环神经网络(RNN)原理及BPTT算法
因循环神经网络基于ANN之上,理解ANN有助于理解RNN,所以阅读此文,建议先阅读。
分治算法之快速排序
分治算法由两部分组成: 分:递归解决较小的问题(基本情况除外)。 治:然后从子问题的解构建原问题的解。 传统上,在正文中至少含有两个递归调用的例程叫作分治算法,而正文中只含有一个递归调用的例程不是分治算法。一般坚持子问题是不相交的(即基本不重叠)。 分治算法的经典例子有归并排序和快速排序,它们分别有O(N logN)的最坏情形以及平均情形的时间界。 所有有效的分治算法都是把问题分成一些子
pscad IEEE标准系统搭建说明
pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。
VC中sqlite的使用
在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示
快速排序算法实现思想个人理解
1.概述 快速排序是冒泡排序的改进算法。它也是通过不断比较和移动交换来实现排序的,只不过它的实现增大了记录的比较和移动的距离,将关键字较大的元素从前面直接放到后面,关键字较小的元素直接从后面放到前面,从而减小了比较次数和交换次数。 2.原理 通过一趟排序将待排序数据分割成独立的两个子序列,其中左边的子序列均比右边的子序列中的元素小,然后分别对左右两个子序列继续进行排序,达到整个序列有序的...
假人有限元模型
假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用
快速排序算法原理
1.快速排序算法是什么? 想必大家都学过和用过冒泡排序吧!这应该是大家成为程序员道路上学的第一个算法哦,那么我们的快速排序算法其实是在冒泡排序的基础上的一个改进,快速排序算法是利用一趟快速排序,一趟快排一般都是取第一个数作为准基数进行排序,将一串数据分成两个部分, 第一部分都比准基数小,第二部分都比准基数大,如:(-------第一部分------准基数------第二部分),也就这样以准...
IEM模型,地表粗糙度模拟
利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟
随机主元快速排序
快速排序,也是用的分而治之的算法,但是与归并不一样的,归并排序侧重的是最后怎么把子问题合并,分解子问题就是从中间分开。快排侧重于把子问题分开的部分,而不侧重合并 下面看个将数组从小到大排序的例子: (1)两个索引,P1和P2。 P1的左边(包括P1)是比主元小的元素,,又边则是比主元大的元素。 P2遍历没有考察的元素 (2)随机选取主元。 在数组中,随机选取一个元素,令其作为标准,结束后其左边是比它小的元素,右边是比他大的元素。选取主元后,将主元放到数组最右边,方便考察。 (3)开始考察 4比3大,不动
【算法】快速排序算法原理及实现
快速排序算法原理及实现
快速排序算法原理与实现
摘要:本文描述了快速排序的算法原理,给出了算法的逐步排序过程以及算法的实现。最后对算法的性能进行了分析。 1. 问题描述 输入:n个数的序列<a1,a2,a3,...,an>。 输出:原序列的一个重排<a1*,a2*,a3*,...,an*>;,使得a1*<=a2*<=a3*<=...<=an*。 2.问题分析 快速排序:最基本的思想就是通过一趟排序,将待排序记录分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,则可分别对这两部分记录进行排序,以达到整个序列有序。 排序过程:(对
快速排序(随机化快速排序 随机主元)java代码(递归实现)分治法(分而治之)
固定主元的快速排序: 1.首先选取一个主元(一般取数组的头部或者尾部为主元); 2.把其他数与主元比较,如果比主元小,放主元左边,如果比主元大,放主元右边;(这个时候主元左边的数都只是比主元小,左边的数还没有从小到大排好)。 3.对主元左边数组段重复1,2步骤;对右边也重复1,2步骤。 ps:上述步骤2的具体实现说明(主元以每次选取数组尾端元素为例): 1.创建两个指针i,j;i初始值为数组头部元素下标减一,j为数组头部元素下标(i左边存放比主要小的元素,i到j存放比主元大的元素,等到j走到尾端要交换主元素
快速排序算法和原理
文章目录快速排序原理代码 快速排序原理 它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。 在快排的过程中,每一次我们要取一个元素作为枢纽值,以这个数字来将序列划分为两部分。在此我们采用三数取中法,也就是取左端、中间、右端三个数,然后进行排序,将中间数作为枢纽值。 最本质的总结: 快速排序,说白了就是给基准数据找其正确索引位置的过程. 如
快速排序算法详解
快速排序(Quick Sort)是计算机科学与技术领域中非常经典的一种排序算法,由C. A. R. Hoare在1960年提出。它应用分治思想进行排序,通过对数据进行分区操作,并递归地对分区后的子序列进行排序,从而达到整个序列有序的目的。
排序算法:快速排序算法
重新排列数组的元素,使所有小于基准的元素位于其左侧,所有大于基准的元素位于右侧。(枢轴元素)放置在这样的位置:小于它的元素位于其左侧,大于它的元素位于其右侧。这有助于我们将小于枢轴元素的元素移动到其左侧,将较大的元素移动到其右侧。是我们的主元元素,所有比它自身大的元素都在它的右侧,而比主元小的元素都在它的左侧。在这一步中,子列表被分为两部分——枢轴元素之前的子列表和枢轴元素之后的子列表。选择枢轴元素,这里为了简单起见,我们选择最右边的元素作为枢轴。在这种情况下,时间复杂度将是每个步骤的所有复杂度的总和。
快速排序原理
高快省的排序算法 有没有既不浪费空间又可以快一点的排序算法呢?那就是“快速排序”啦!光听这个名字是不是就觉得很高端呢。 假设我们现在对“6 1 2 7 9 3 4 5 10 8”这个10个数进行排序。首先在这个序列中随便找一个数作为基准数(不要被这个名词吓到了,就是一个用来参照的数,待会你就知道它用来做啥的了)。为了方便,就让第一个数6作为基准数吧。接下来,需要将这个序列中所有比...
使用C++实现快速排序:采用随机数选择主元
快速排序,平均复杂度为O(nlogn),其原理是选取一个主元,不断的将数组分成左右两个子区间,左边的小于等于主元,右边的大于主元。再对左右区间进行递归,不断分隔,直到区间长度为1,说明所有的元素已经排序完成。
随机选择算法
如何从一个无序数组中求出第K大的数(假设数组中的数各不相同)。例如,对数组{5,12,7,2,9,3}来说,求第2大的数为9。 最直接的想法是对数组进行排序,然后取出第K个元素即可。但这样做的时间复杂度为O(nlogn),而随机选择算法,他对任何输入都可以达到O(n)的期望时间复杂度。 随机选择算法的原理类似于随机快速排序算法。当对A[left,right]执行一次randPartition函数后...
3093



被折叠的 条评论
为什么被折叠?



