题目:

E 快速排序:以下代码可以从数组a[]中找出第k小的元素。
它使用了类似快速排序中的分治算法,期望时间复杂度是O(N)的。
请仔细阅读分析源码,填写划线部分缺失的内容。

#include <stdio.h>
int quick_select(int a[], int l, int r, int k)
{int p = rand() % (r - l + 1) + l;int x = a[p];{int t = a[p];a[p] = a[r];a[r] = t;}int i = l, j = r;while(i < j){while(i < j && a[i] < x)i++;if(i < j){a[j] = a[i];j--;}while(i < j && a[j] > x)j--;if(i < j){a[i] = a[j];i++;}}a[i] = x;p = i;if(i - l + 1 == k)return a[i];if(i - l + 1 < k)return quick_select( _____________________________ ); //填空elsereturn quick_select(a, l, i - 1, 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;
}

注意:只填写划线部分缺少的代码,不要抄写已经存在的代码或符号。

分析:

好久没见过快排了,复习也没看过,这里遇到了就简单说一下,加深一下印象:
快排是最快的通用内部排序算法。按照分治三步法:
(1)划分问题:将数组的各个元素重排后分为左右两个部分,使得左边的任意元素都小于或等于右边的任意元素。
(2)递归求解:把左右两边分别排序;
(3)合并问题:不用合并,因为此时数组已经完全有序。
快排由于划分方式不同,版本很多,在这里这道题用的是随机数划分: int p = rand() % (r - l + 1) + l;表示闭区间【l~r】的任意一个数。

先看参数的作用:
这里的参数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)

//#include <stdio.h>
#include<bits/stdc++.h>int quick_select(int a[], int l, int r, int k)
{int p = rand() % (r - l + 1) + l; //l~r之间的一个随机数int x = a[p];//随机数a[p]的值{int t = a[p];    //交换随机数a[p]和高位右边第一个数a[p] = a[r];a[r] = t;}int i = l, j = r; //i左指针 j右指针while(i < j){while(i < j && a[i] < x)i++;// 最后i==j 或者 a[i]>=xif(i < j)  //如果a[i]>=随机数x{a[j] = a[i]; //选一个比x大的数 放到高位j--;}while(i < j && a[j] > x)j--;// 最后j==i 或者 a[i]<=xif(i < j)  //如果a[i]<=随机数x{a[i] = a[j]; //选一个比x小的数 放到低位i++;}}a[i] = x;//  p = i;//这里改了p的值 说明会用到p,且p的值等于i的值if(i - l + 1 == k)return a[i];if(i - l + 1 < k)return quick_select(a,i+1,r,k-(i-l+1)); //填空elsereturn 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;
}

2018年蓝桥杯B组题E题+快排相关推荐

  1. 2013第四届蓝桥杯Java组省赛题解析

    2013第四届蓝桥杯Java组省赛题解析 目录 第一题:高斯日记 第二题:马虎的算式 第三题:第39级台阶 第四题:黄金连分数 ​第五题:前缀判断 第六题:三部排序 ​第七题:错误票据 第八题:翻硬币 ...

  2. 2018年蓝桥杯A组C/C++决赛题解

    2018年第九届蓝桥杯A组C/C++决赛题解 点击查看视频题解 点击查看2018年蓝桥杯A组C/C++决赛题目(不含答案) 1:三角形面积 画个图,求三角形面积,可以用外接长方形 - 其他多余区域面积 ...

  3. 2016蓝桥杯A组第十题 最大比例

    最近准备蓝桥杯比赛,看了去年蓝桥杯A组初赛的试题,最后一题花费了很多时间才找到思路.本人也是刚学习算法,很多都不懂,只好班门弄斧,各位大牛见笑了. 直接上题: X星球的某个大奖赛设了M级奖励.每个级别 ...

  4. 2018年第九届蓝桥杯B组第四题:摔手机题解

    摔手机 摔手机 动态规划  在蓝桥杯的时候遇到一次 当时没有做对  看了题解也没明白  如今再次遇到这个类似的题目 于是拿出来补补吧 摔手机题目如下: 星球的居民脾气不太好,但好在他们生气的时候唯一的 ...

  5. 26行代码AC_试题 历届试题 日期问题 | 第八届蓝桥杯B组第七题

    问题描述   小明正在整理一批历史文献.这些历史文献中出现了很多日期.小明知道这些日期都在1960年1月1日至2059年12月31日.令小明头疼的是,这些日期采用的格式非常不统一,有采用年/月/日的, ...

  6. 2018年蓝桥杯b组国赛真题

    1.标题:换零钞 x星球的钞票的面额只有:100元,5元,2元,1元,共4种. 小明去x星旅游,他手里只有2张100元的x星币,太不方便,恰好路过x星银行就去换零钱. 小明有点强迫症,他坚持要求200 ...

  7. 【蓝桥系列】——十三届蓝桥杯PythonB组第五题E题蜂巢(AC代码)

    大家好,我是普通小明,初入学习博客,一起加油! 首先,感谢 小蓝刷题 对我的鼓励,我也希望加入学习算法这个大家庭. 第一篇文章,有些不完美,还请多多指教. 目录 (好像我并不会用锚点T-T) 省赛心得 ...

  8. 2021蓝桥杯B组 第I题杨辉三角形

    第I题 杨辉三角形 题目大意: 解法一:(得20%) 思路: 当指考虑小范围的值时,我们可以直接根据杨辉三角形的规律:第i行第j列的值=第i-1行第j列的值+第i-1行第j-11列的值,来把前50个杨 ...

  9. 第七届蓝桥杯b组第八题-四平方和

    四平方和 四平方和定理,又称为拉格朗日定理: 每个正整数都可以表示为至多4个正整数的平方和. 如果把0包括进去,就正好可以表示为4个数的平方和. 比如: 5 = 0^2 + 0^2 + 1^2 + 2 ...

最新文章

  1. java 解析cron_springtask 的使用方法和 cron 表达式解析
  2. JAVA SE学习day_12:集合的排序、队列、栈结构
  3. OK,让我们开始吧!
  4. Hadoop 2.0联邦机制
  5. HDU 1853 HDU 3488【有向环最小权值覆盖问题 】带权二分图匹配 KM算法
  6. “java程序打成jar包 如何处理第三方jar包”
  7. pymysql(part1)--pymysql初识之检索/增加/更新/删除数据
  8. Google C++单元测试框架(Gtest)系列教程之一——入门
  9. 【程序设计】变量和常量
  10. 我就是那个一直拿着死工资的人
  11. 和老师们合作,注定了是打工的(转)
  12. 【数字信号去噪】基于matlab小波软阈值+硬阈值+改进阈值轴承故障仿真信号去噪【含Matlab源码 1024期】
  13. python 3.X中打包二进制数据存储字符串出错原因分析
  14. 帧间差分法函数python_【目标追踪】python帧差法原理及其实现
  15. Reinforcement Learning An Introduction~The 10-armed Testbed
  16. 一元三次方程求解matlab_用Matlab ode45函数解常微分方程
  17. 【工艺】 CNC(数控机床)加工工艺
  18. 周庄王,姬佗(公元前696年—公元前682年在位)
  19. java微信公众号开发及源码分享
  20. Python_牛顿迭代法求方程的实根

热门文章

  1. Eclipse之如何导入arr文件
  2. Android studio之Error:(23, 17) Failed to resolve: junit:junit:4.12
  3. Android之事件总线EventBus详解
  4. 网页版消消乐快速实现,无代码吗iVX 真那么简单?
  5. 对象比较 ===三个等于号
  6. python画气泡图_​用Python把图做的好看点:用Matplotlib画个好看的气泡图
  7. python在web可以开发吗_Python Web开发
  8. 全球顶级大学,在中国录取率却不足0.5%,答案一针见血!
  9. 堪称经典!这部由苏联最杰出数学家编写的数学教材,为何能大受推崇?
  10. 和套套一样,一次性橡胶手套制作现场, 这鬼畜的画风