快速排序|2018年蓝桥杯B组题解析第五题-fishers
标题:快速排序
以下代码可以从数组a[]中找出第k小的元素。
它使用了类似快速排序中的分治算法,期望时间复杂度是O(N)的。
请仔细阅读分析源码,填写划线部分缺失的内容。
#include <stdio.h>
#include<cstdlib>
int quick_select(int a[], int l, int r, int k) {
int p = rand() % (r - l + 1) + l; //l~r之间的一个随机数
int x = a[p];//x的值随机数a[p]的值
{int t = a[p]; a[p] = a[r]; a[r] = t;} //交换随机数a[p]和高位右边第一个数
int i = l, j = r; //i左指针 j右指针
while(i < j) {
while(i < j && a[i] < x) i++;// 最后i==j 或者 a[i]>=x
if(i < j) {//如果a[i]>=随机数x
a[j] = a[i]; //选一个比x大的数 放到高位
j--;
}
while(i < j && a[j] > x) j--;// 最后j==i 或者 a[i]<=x
if(i < j) {//如果a[i]<=随机数x
a[i] = a[j]; //选一个比x小的数 放到低位
i++;
}
}
a[i] = x;
p = i;//这里改了p的值 说明会用到p
if(i - l + 1 == k) return a[i];
if(i - l + 1 < k) return quick_select(_________); //填空
else return quick_select(a, l, i - 1, k);//a数组不变 k不变
}
int main()
{
int a[] = {1, 4, 2, 8, 5, 7, 23, 58, 16, 27, 55, 13, 26, 24, 12};
printf("%d\n", quick_select(a, 0, 14, 5));
return 0;
}
注意:只填写划线部分缺少的代码,不要抄写已经存在的代码或符号。
答案:a, p+1, r, k-(i-l+1) 或者 a, p, r, k-i+l
思路:首先学会快速排序的划分思想(看下张图理解快排的双指针)
左指针l:确认i左边都小于当前选定的枢纽
右指针r:确定j右边都大于当前选定的枢纽
枢纽:快速排序单遍扫描,可以选第一个元素为枢纽,也可以随机选元素作为枢纽。
这道题要我们找到数组中第k小的元素,
思路和快速排序一样:划分,分解,合并
关键在于划分:
先看参数的作用:
这里的参数l表示左指针,r表示右指针(功能同快速排序一致)
参数1:a表示数组不变
参数2:l表示左指针下标边界
参数2:r表示右指针下标边界
参数4:k表示选择第k小的元素
回到快速排序的各个指针的变化:
l~i区间内都是比枢纽小的,一共i-l+1个元素;
i+1~r都是比枢纽大的
如果i-l+1比k大,说明要在l~i-1中找;还是找第k个元素
如果i-l+1比k小,说明要在i+1~r某个值中找,这个值是多少呢?要看还需要找到新一轮递归中找第多少小的元素,这里新参数k就等于 原k减去当前一轮的l~i的个数 即k-(i-l+1)
快速排序|2018年蓝桥杯B组题解析第五题-fishers的更多相关文章
- 2018年蓝桥杯B组C/C++决赛题目
自己的博客排版,自我感觉略好一点. 先放上题目. 点击查看2018年蓝桥杯B组C/C++决赛题目题解 1.换零钞 x星球的钞票的面额只有:100元,5元,2元,1元,共4种. 小明去x星旅游, ...
- 2018年蓝桥杯A组C/C++决赛题解
2018年第九届蓝桥杯A组C/C++决赛题解 点击查看视频题解 点击查看2018年蓝桥杯A组C/C++决赛题目(不含答案) 1:三角形面积 画个图,求三角形面积,可以用外接长方形 - 其他多余区域面积 ...
- 2018年蓝桥杯A组C/C++决赛题目
2018年蓝桥杯A组C/C++决赛题目 2018年蓝桥杯A组C/C++决赛题解 1:三角形面积 已知三角形三个顶点在直角坐标系下的坐标分别为: (2.3, 2.5) (6.4, 3.1) (5 ...
- 2018年蓝桥杯B组C/C++决赛题解
2018年第九届蓝桥杯B组C/C++决赛题解 点击查看2018年蓝桥杯B组C/C++决赛题目(不含答案) 1.换零钞 ok 枚举 设x表示1元钱的个数,y表示2元钱的个数,z表示5元钱的个数 x+21 ...
- 乘积最大|2018年蓝桥杯B组题解析第十题-fishers
标题:乘积最大 给定N个整数A1, A2, ... AN.请你从中选出K个数,使其乘积最大. 请你求出最大的乘积,由于乘积可能超出整型范围,你只需输出乘积除以1000000009的余数. 注意,如果X ...
- 第六届蓝桥杯JavaA组国(决)赛真题
解题代码部分来自网友,如果有不对的地方,欢迎各位大佬评论 题目1.胡同门牌号 小明家住在一条胡同里.胡同里的门牌号都是连续的正整数,由于历史原因,最小的号码并不是从1开始排的. 有一天小明突然发现了有 ...
- 前缀判断|2013年蓝桥杯B组题解析第五题-fishers
前缀判断 如下的代码判断 needle_start指向的串是否为haystack_start指向的串的前缀,如不是,则返回NULL. 比如:"abcd1234" 就包含了 &quo ...
- 第六届蓝桥杯JavaB组国(决)赛真题
解题代码部分来自网友,如果有不对的地方,欢迎各位大佬评论 题目1.分机号 X老板脾气古怪,他们公司的电话分机号都是3位数,老板规定,所有号码必须是降序排列,且不能有重复的数位.比如: 751,520, ...
- 第九届蓝桥杯JavaB组国(决)赛真题
解题代码部分来自网友,如果有不对的地方,欢迎各位大佬评论 题目1.三角形面积 已知三角形三个顶点在直角坐标系下的坐标分别为: (2.3, 2.5) (6.4, 3.1) (5.1, 7.2) 求该三角 ...
随机推荐
- 【mlflow】执行import mlflow 报错:ImportError: No module named 'pkg_resources'
命令行运行 python -c “import mlflow” 的时候报错: ImportError: No module named 'pkg_resources' 结果发现是因为本地有一个文件夹叫 ...
- kubernetes实战(二十):k8s一键部署高可用Prometheus并实现邮件告警
1.基本概念 本次部署使用的是CoreOS的prometheus-operator. 本次部署包含监控etcd集群. 本次部署适用于二进制和kubeadm安装方式. 本次部署适用于k8s v1.10版 ...
- Html各组件MIME类型
扩展名 类型/子类型 * application/octet-stream 323 text/h323 acx application/internet-property-stream ai appl ...
- 泛型T和通配符?的区别
这里如果是泛型T的话,那么创建该类的时候就需要指定类型,而通配符不需要.
- 集成RabbitMQ做秒杀
由于秒杀的并发量太大,所以仅仅使用缓存是不够的,还需要用到RabbitMQ. 这里推荐一款用于分库分表的中间件:mycat 解决超卖的问题(看第五章节): 秒杀接口优化: 实操: 然后把下载好的文件上 ...
- mysql 内置功能 存储过程介绍
存储过程介绍 就是mysql内置功能把逻辑写好 的功能给封装好,封装成一个接口名,把接口名丢给应用程序,应用程序直接调用接口名实现一系列增删改查功能 这个接口叫存储过程 基于存储过程封装成一个功能 存 ...
- Mac SVN版本从1.9降到1.8
假设系统已安装brew,在终端执行下列命令: brew update brew install subversion18 echo 'export PATH="/usr/local/opt/ ...
- 测试常用的Oracle11G 命令行指令。
测试常用的Oracle11G 命令行指令. ×××××××××××××××× 登录:
- SQL 中单引号 和一些特殊字符的处理
为了防止程序SQL语句错误以及SQL注入,单引号必须经过处理.有2种办法: 1.使用参数,比如SELECT * FROM yourTable WHERE name = @name; 在Java中就是用 ...
- C/S模型之UDP协议
说明:利用UDP协议,创建一个服务器和一个客户端.两者间进行通信.由客户端进行输入内容,而服务器将接受的内容进行再一次返回,并显示在服务端. // UDP_Seversock.cpp : 定义控制台应 ...