【算法基础】(一)基础算法 --- 快速排序

news2025/8/13 22:05:49

✨个人主页:bit me
✨当前专栏:算法基础
🔥专栏简介:该专栏主要更新一些基础算法题,有参加蓝桥杯等算法题竞赛或者正在刷题的铁汁们可以关注一下,互相监督打卡学习 🌹 🌹 🌹

快 速 排 序

  • 💤一. 快速排序:(分治)
  • 💦二.第k个数

 

💤一. 快速排序:(分治)

题目要求:

给定你一个长度为n的整数数列
请你使用快速排序对这个数列按照从小到大进行排序
并将排好的数列按顺序输出

输入格式:

输入一共两行,第一行包含整数n
第二行包含n个整数(所有整数均在1 ~ 10^9范围内),表示整个数列

输出格式:

输出共一行,包含n个整数,表示排好序的数列

数据范围:

1 <= n <= 100000

输入样例:

5
3 1 2 4 5

输出样例:

1 2 3 4 5

快排思路:

  1. 先确定分界点:左右极点分别为q[i],q[j],中间值为q[(i+j) / 2]
  2. 调整区间:定义一个任意值x,让小于x的值都挪到x左边,让大于x的值都挪到x右边
  3. 递归处理左右两段,让他们进行排序然后衔接,方法就是左右极限都定义一个指针,左指针往右走,遇到大于x的值就停下来,右指针往左走,遇到小于x的值就停下来,然后俩指针指向的值进行交换,直到相遇为止,这样左边就全是小于x的值,右边全是大于x的值,然后完成衔接,排序就完成了

导图:
在这里插入图片描述

  1. 首先我们需要输入第一行包含整数n,第二行包含n个整数:
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int[] q = new int[n];
for(int i=0; i<n; i++){
	q[i] = sc.nextInt();
}
  1. 对快速排序函数进行分类处理:

①:当左边界大于等于右边界的时候直接返回

if(l >= r) return;

②:取随机值x我们最好取左右边界的中间值,因为取左右边界值可能会超时,时间复杂度退化,当我们左右指针往中间挪的时候我们不要把起点定在左右边界处,要放在边界外面一位,方便我们处理边界,不容易发生混淆

int x = q[l + r >> 1], i = l - 1, j = r + 1;

③:当左指针没遇到右指针的时候,我们需要考虑到随机值x,当左指针小于x的时候就往右边走,当右指针大于x的时候就往左边走,如果左指针和右指针都停了的时候,就交换两边的数据,然后继续往后走

while(i < j){
    while( q[++i] < x );
    while( q[--j] > x) ;
    if(i < j){
        int t = q[i];
        q[i] = q[j];
        q[j] = t;
    }
}

④:对边界的处理

quickSort(q, l, j);
quickSort(q, j + 1, r);

在这里对边界进行一个小结:

quickSort(q, l, j);
quickSort(q, j + 1, r);

quickSort(q, l, i - 1);
quickSort(q, i, r);

  1. 是因为对于第一次处理后的数组,索引i左侧的数字都是小于等于x,但不包括q[i]。索引i右侧的数字都是大于等于x,包括q[i]。故区间分为[l,i-1]和[i,r]。
  2. 同理,对于第一次处理后的数组,索引j左侧的数字都是小于等于x,包括q[j]。索引j右侧的数字都是大于等于x,不包括q[j]。故区间分为[l,j]和[j+1,r]。

再对x位置小结:

  1. 如果区间取[l,i-1]和[i,r]这种,那么x不应该取左边界(l、(l+r)/2)。
    应取 x = q[r]; x = q[(l+r+1)/2];
  2. 如果区间取[l,j]和[j+1,r]这种,那么x不应该取右边界(如r、(l+r+1)/2)。
    应取 x = q[l]; x = q[(l+r)/2];
     
    自己选择其中一种即可。

附上总的代码

public static void main(String[] args){
    Scanner sc = new Scanner(System.in);
    int n = sc.nextInt();
    int[] q = new int[n];
    for(int i=0; i<n; i++){q[i] = sc.nextInt();}

    quickSort(q, 0, n-1);
    for(int i=0; i<n; i++){System.out.print(q[i] + " ");}
}

public static void quickSort(int[] q, int l, int r){
    if(l >= r) return;
    int x = q[l + r >> 1], i = l - 1, j = r + 1;
    while(i < j){
        while( q[++i] < x );
        while( q[--j] > x) ;
        if(i < j){
            int t = q[i];
            q[i] = q[j];
            q[j] = t;
        }
    }
    quickSort(q, l, j);
    quickSort(q, j + 1, r);
}

 

💦二.第k个数

题目要求:

给定一个长度为 n 的整数数列,以及一个整数 k,请用快速选择算法求出数列从小到大排序后的第 k 个数。

输入格式:

第一行包含两个整数 n 和 k。
第二行包含 n 个整数(所有整数均在 1∼109 范围内),表示整数数列。

输出格式:

输出一个整数,表示数列的第 k 小数。

数据范围:

1≤n≤100000 ,
1≤k≤n

输入样例:

5 3
2 4 1 5 3

输出样例:

3

根据我们上述的快排思路,我们还可以再多分一步就可以

  1. 先确定分界点:左右极点,中间值
  2. 左边所有数<= x,右边所有数>= x
  3. 当我们找的k小于等于x的时候,就递归左边所有的数Left,反之,当k大于x的时候,就递归右边的所有的数Right
  1. 首先我们需要创建两个整数 n 和 k,创建数组arr来输入
Scanner s  =  new Scanner(System.in);
int n = s.nextInt();
int k = s.nextInt();
int[] arr = new int[n];
for(int i = 0;i < arr.length;i++){
    arr[i] = s.nextInt();
}
  1. 接下来我们需要按照快排函数来实现它,和上面一题思路一样代码也一样,模板照抄

①:分情况处理

if(left >= right) return left;
int x = arr[(left + right) / 2],i = left - 1,j = right + 1;
while(i < j){
    while(arr[++i] < x);
    while(arr[--j] > x);
    if(i < j){
        int temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
    }
}

②:边界问题

int sl = j - left + 1;
if(k <= sl) return quickSort(arr,left,j,k);
else return quickSort(arr,j+1,right,(k-sl));

在这里sl代表小于x的区域,它的范围个数是 j - left + 1,当k值小于第一区域个数时,返回的就是第一个区域的个数数值,当它个数范围比第一区域大的时候,就在大于x的区域找,第二个区域的范围就是 j + 1到 right,然后返回值为k - sl

附上总的代码

public static void main(String[] args){
    Scanner s  =  new Scanner(System.in);
    int n = s.nextInt();
    int k = s.nextInt();
    int[] arr = new int[n];
    for(int i = 0;i < arr.length;i++){
        arr[i] = s.nextInt();
	}
    int result = quickSort(arr,0,n-1,k);
    System.out.print(arr[result]);
}

public static int quickSort(int[] arr,int left,int right,int k){
    if(left >= right) return left;
    int x = arr[(left + right) / 2],i = left - 1,j = right + 1;
    while(i < j){
        while(arr[++i] < x);
        while(arr[--j] > x);
        if(i < j){
            int temp = arr[i];
            arr[i] = arr[j];
            arr[j] = temp;
        }
    }
    int sl = j - left + 1;
    if(k <= sl) return quickSort(arr,left,j,k);
    else return quickSort(arr,j+1,right,(k-sl));
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/33303.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

游戏品类加速回暖,文娱内容持续火热——2022年IAA行业品类发展洞察系列报告·第三期

易观分析&#xff1a;易观分析联合穿山甲与巨量算数共同构建IAA发展指数&#xff0c;通过行业规模、内容热度、商业变现的多维数据指标反映行业细分品类的发展情况&#xff0c;对领域季度运行情况、热门品类进行分析解读&#xff0c;助力开发者深入洞察领域特性和发展趋势&…

【American English】美语的连读规则

文章目录连读规则1. 辅音 元音2. 辅音 辅音情形1: 相同或相近的辅音相遇情形2: 辅音 h情形3: 爆破音 [l] / [m] / [n]情形4: 爆破音 [f] / [v]情形5: 爆破音 [tf]/[]3. 元音 元音情形1: 嘴唇变平时增加 [y] 音情形2: 嘴唇变圆时增加 [w] 音4. 特殊辅音 yRef连读规则 英…

open-set recognition(OSR)开集识别

开集识别 闭集识别 ​ 训练集中的类别和测试集中的类别是一致的&#xff0c;最常见的就是使用公开数据集进行训练&#xff0c;所有数据集中的图像的类别都是已知的&#xff0c;没有未知种类的图像。传统的机器学习的算法在这些任务上已经取得了比较好的效果。 &#xff08;训…

简述供应商管理SRM系统

简道云SRM管理系统供应商关系管理(SRM系统)&#xff0c;是企业可以用来对供应商的优势和能力进行系统的、全行业范围的评估&#xff0c;涉及企业整体的商业战略&#xff0c;供应商寻源、采购审批、比价、招投标管理、订单执行、库存可视化管理、财务支付审批对账、供应商绩效评…

java--并发

并发1.java的线程状态&#xff08;1&#xff09;sleep wait的区别和联系2.线程池的核心参数3.lock 和 synchronized4.volatile能否保证线程安全5.java中的悲观锁和乐观锁6.Hashtable和ConcurrentHashMap7.对ThreadLocal1.java的线程状态 new 新建&#xff1a;普通的类&#xf…

流媒体技术基础-流媒体服务与框架

一、开源流媒体服务器 38款 流媒体服务器开源软件 主流的开源流媒体服务器及框架如下&#xff1a; 1.Live555 [RTSP拉流] 一个为流媒体提供解决方案的跨平台的C开源项目&#xff0c;它实现了对标准流媒体传输协议如 RTP/RTCP、RTSP、SIP等的支持。 实现了对多种音视频编码格…

【毕业设计】机器学习的溢油特征提取与识别

前言 &#x1f4c5;大四是整个大学期间最忙碌的时光,一边要忙着准备考研,考公,考教资或者实习为毕业后面临的就业升学做准备,一边要为毕业设计耗费大量精力。近几年各个学校要求的毕设项目越来越难,有不少课题是研究生级别难度的,对本科同学来说是充满挑战。为帮助大家顺利通过…

城市内涝地埋式积水监测系统解决方案

一、方案背景 近 20 年来&#xff0c;我国城市化进程加快&#xff0c;城市地区由于人口密集&#xff0c;物资财产密度不断加大等特点&#xff0c;高强度暴雨积水形成的洪涝灾害对城市化地区产生的威肋和带来的狠失愈来愈大。由于城市的不断扩建&#xff0c;使工业区、商业区和居…

dos2unix和unix2dos

一 单次转换 用于转换Windows和UNIX的换行符&#xff0c;通常在windows系统中开发的源码文件&#xff0c;换行符是\r\n,二linux中的文件的换行符是\n。如果不转行可能会出错。在windows记事本写一个hello world源码. #include <stdio.h>int main(void) {printf("h…

Jmeter快速入门

Jmeter依赖于JDK&#xff0c;所以必须确保当前计算机上已经安装了JDK&#xff0c;并且配置了环境变量。 Apache JMeter 是 Apache 组织基于 Java 开发的压力测试工具&#xff0c;用于对软件做压力测试。 JMeter 最初被设计用于 Web 应用测试&#xff0c;但后来扩展到了其他测试…

【Python百日进阶-WEB开发-冲進Flask】Day182 - Flask蓝图与模板继承

文章目录一、day02项目环境和结构搭建1.1 项目根目录创建apps包1.2 项目模板目录templates创建user子目录二、后端知识要点2.1 蓝图Blueprint基础知识2.1.1 为什么需要蓝图2.1.2 什么是蓝图2.1.3 蓝图的属性2.1.4 蓝图使用的步骤2.1.4.1 创建一个蓝图的包,例如user,并在view.py…

蓝牙耳机什么牌子音质最好?音质超好的蓝牙耳机推荐

蓝牙耳机在便捷性上&#xff0c;没有线材的蓝牙耳机&#xff0c;日常通勤、运动、平时走路佩戴&#xff0c;那种因为无线而带来的无缠绕感觉都是有线耳机无法媲美的&#xff0c;但是音质很多人都会觉得有线的好&#xff0c;由于近几年耳机市场的不断进步&#xff0c;很多蓝牙耳…

《痞子衡嵌入式半月刊》 第 67 期

痞子衡嵌入式半月刊&#xff1a; 第 67 期 这里分享嵌入式领域有用有趣的项目/工具以及一些热点新闻&#xff0c;农历年分二十四节气&#xff0c;希望在每个交节之日准时发布一期。 本期刊是开源项目(GitHub: JayHeng/pzh-mcu-bi-weekly)&#xff0c;欢迎提交 issue&#xff0c…

8-Arm PEG-Azide,8-Arm PEG-N3,八臂-聚乙二醇-叠氮多臂PEG衍生物供应

1、名称 英文&#xff1a;8-Arm PEG-Azide&#xff0c;8-Arm PEG-N3 中文&#xff1a;八臂-聚乙二醇-叠氮 2、CAS编号&#xff1a;N/A 3、所属分类&#xff1a;Azide PEG Multi-arm PEGs 4、分子量&#xff1a;可定制&#xff0c;八臂-peg 5k-叠氮、八臂PEG 2k叠氮、叠氮-…

卷积神经网络

Datawhale开源学习&#xff0c;机器学习课程&#xff0c;项目地址&#xff1a;https://github.com/datawhalechina/leeml-notes Convolutional Neural Network 本节内容学习了什么是CNN卷积神经网络&#xff0c;相比于全连接网络&#xff0c;它每次只提取部分内容作为整个网络…

专利如果申请?成功率如何提高?

问题一&#xff1a;专利如何申请&#xff1f;​ 1、整理技术方案&#xff0c;整理一套属于你的创新技术方案&#xff1b; 2、专利检索&#xff0c;确保你的创新没有被别人申请过&#xff1b; 3、撰写专利申请书&#xff0c;为了快速审查&#xff0c;做好长期专利布局&#x…

珈创生物上市再次失败:先后折戟科创板、创业板,郑从义为董事长

第二次冲刺上市之旅&#xff0c;珈创生物再次以失败而告终。 11月23日&#xff0c;深圳证券交易所创业板披露的信息显示&#xff0c;因武汉珈创生物技术股份有限公司&#xff08;即“珈创生物”&#xff09;提交了撤回首次公开发行股票并在创业板上市申请文件的申请&#xff0…

医院微信预约挂号小程序开发_分享医院做预约挂号小程序的可以实现什么功能

小程序有 60入口&#xff0c;在微信生态链中无处不在&#xff0c;只要客户是微信用户&#xff0c;他们可以根据搜索、二维码朋友圈找到你的小程序。哪怕是医药行业&#xff0c;也可以做个医院小程序来提高预约和经营运转的效率&#xff0c;解放人力。 1.医院微信预约小程序怎么…

ubuntu下个人觉得必备,好用的应用软件

ubuntu下个人觉得必备&#xff0c;好用的应用软件 本文基于ubuntu20.04 进行讨论。 之前用了很久ubuntu14.04&#xff0c; 因为apt安装依赖的问题&#xff0c;导致系统重装&#xff0c;才被动升级到了20.04. 结果升级后发现了新大陆。 很多原来只能在windows下使用的软件&…

【多目标进化优化】 Pareto 最优解集的构造方法

1. 构造 Pareto 最优解的简单方法 1.1 Deb 的非支配排序方法 \quad\quad设进化群体为 PPP&#xff0c;同时设置一个构造集 P′PP′。算法开始时将第一个个体放人构造集 P′PP′ 中&#xff0c;依次将进化群体 PPP 中的个体 p&#xff08;p∉P′&#xff09;p&#xff08;p∉P&…