标题:快速排序

以下代码可以从数组a[]中找出第k小的元素。

它使用了类似快速排序中的分治算法,期望时间复杂度是O(N)的。

请仔细阅读分析源码,填写划线部分缺失的内容。

  1. #include <stdio.h>
  2. #include<cstdlib>
  3. int quick_select(int a[], int l, int r, int k) {
  4. int p = rand() % (r - l + 1) + l; //l~r之间的一个随机数
  5. int x = a[p];//x的值随机数a[p]的值
  6. {int t = a[p]; a[p] = a[r]; a[r] = t;} //交换随机数a[p]和高位右边第一个数
  7. int i = l, j = r; //i左指针 j右指针
  8. while(i < j) {
  9. while(i < j && a[i] < x) i++;// 最后i==j 或者 a[i]>=x
  10. if(i < j) {//如果a[i]>=随机数x
  11. a[j] = a[i]; //选一个比x大的数 放到高位
  12. j--;
  13. }
  14. while(i < j && a[j] > x) j--;// 最后j==i 或者 a[i]<=x
  15. if(i < j) {//如果a[i]<=随机数x
  16. a[i] = a[j]; //选一个比x小的数 放到低位
  17. i++;
  18. }
  19. }
  20. a[i] = x;
  21. p = i;//这里改了p的值 说明会用到p
  22. if(i - l + 1 == k) return a[i];
  23. if(i - l + 1 < k) return quick_select(_________); //填空
  24. else return quick_select(a, l, i - 1, k);//a数组不变 k不变
  25. }
  26. int main()
  27. {
  28. int a[] = {1, 4, 2, 8, 5, 7, 23, 58, 16, 27, 55, 13, 26, 24, 12};
  29. printf("%d\n", quick_select(a, 0, 14, 5));
  30. return 0;
  31. }

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

答案:a, p+1, r, k-(i-l+1) 或者 a, p, r, k-i+l

思路:首先学会快速排序的划分思想(看下张图理解快排的双指针)

左指针l:确认i左边都小于当前选定的枢纽

右指针r:确定j右边都大于当前选定的枢纽

枢纽:快速排序单遍扫描,可以选第一个元素为枢纽,也可以随机选元素作为枢纽。

这道题要我们找到数组中第k小的元素,

思路和快速排序一样:划分,分解,合并

关键在于划分:

  1. 先看参数的作用:
  2. 这里的参数l表示左指针,r表示右指针(功能同快速排序一致)
  3. 参数1a表示数组不变
  4. 参数2l表示左指针下标边界
  5. 参数2r表示右指针下标边界
  6. 参数4k表示选择第k小的元素
  7. 回到快速排序的各个指针的变化:
  8. l~i区间内都是比枢纽小的,一共i-l+1个元素;
  9. i+1~r都是比枢纽大的
  10. 如果i-l+1k大,说明要在l~i-1中找;还是找第k个元素
  11. 如果i-l+1k小,说明要在i+1~r某个值中找,这个值是多少呢?要看还需要找到新一轮递归中找第多少小的元素,这里新参数k就等于 k减去当前一轮的l~i的个数 k-(i-l+1)

快速排序|2018年蓝桥杯B组题解析第五题-fishers的更多相关文章

  1. 2018年蓝桥杯B组C/C++决赛题目

    自己的博客排版,自我感觉略好一点. 先放上题目. 点击查看2018年蓝桥杯B组C/C++决赛题目题解     1.换零钞 x星球的钞票的面额只有:100元,5元,2元,1元,共4种. 小明去x星旅游, ...

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

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

  3. 2018年蓝桥杯A组C/C++决赛题目

    2018年蓝桥杯A组C/C++决赛题目 2018年蓝桥杯A组C/C++决赛题解     1:三角形面积 已知三角形三个顶点在直角坐标系下的坐标分别为: (2.3, 2.5) (6.4, 3.1) (5 ...

  4. 2018年蓝桥杯B组C/C++决赛题解

    2018年第九届蓝桥杯B组C/C++决赛题解 点击查看2018年蓝桥杯B组C/C++决赛题目(不含答案) 1.换零钞 ok 枚举 设x表示1元钱的个数,y表示2元钱的个数,z表示5元钱的个数 x+21 ...

  5. 乘积最大|2018年蓝桥杯B组题解析第十题-fishers

    标题:乘积最大 给定N个整数A1, A2, ... AN.请你从中选出K个数,使其乘积最大. 请你求出最大的乘积,由于乘积可能超出整型范围,你只需输出乘积除以1000000009的余数. 注意,如果X ...

  6. 第六届蓝桥杯JavaA组国(决)赛真题

    解题代码部分来自网友,如果有不对的地方,欢迎各位大佬评论 题目1.胡同门牌号 小明家住在一条胡同里.胡同里的门牌号都是连续的正整数,由于历史原因,最小的号码并不是从1开始排的. 有一天小明突然发现了有 ...

  7. 前缀判断|2013年蓝桥杯B组题解析第五题-fishers

    前缀判断 如下的代码判断 needle_start指向的串是否为haystack_start指向的串的前缀,如不是,则返回NULL. 比如:"abcd1234" 就包含了 &quo ...

  8. 第六届蓝桥杯JavaB组国(决)赛真题

    解题代码部分来自网友,如果有不对的地方,欢迎各位大佬评论 题目1.分机号 X老板脾气古怪,他们公司的电话分机号都是3位数,老板规定,所有号码必须是降序排列,且不能有重复的数位.比如: 751,520, ...

  9. 第九届蓝桥杯JavaB组国(决)赛真题

    解题代码部分来自网友,如果有不对的地方,欢迎各位大佬评论 题目1.三角形面积 已知三角形三个顶点在直角坐标系下的坐标分别为: (2.3, 2.5) (6.4, 3.1) (5.1, 7.2) 求该三角 ...

随机推荐

  1. Javascript修正this的引用

    1.使用this作为参数来传递给函数.因为this始终与当前对象一致. <!DOCTYPE html> <html> <head> <meta charset ...

  2. mysql 数据操作 多表查询 多表连接查询 全外连接

    全外连接:显示左右两个表全部记录 全外连接 在内连接的基础上保留左右两表没有对应关系的记录 full join #注意:mysql不支持全外连接 full JOIN mysql> select ...

  3. python 基础3 函数

    函数是什么? 函数一词来源于数学,但编程中的「函数」概念,与数学中的函数是有很大不同的,具体区别,我们后面会讲,编程中的函数在英文中也有很多不同的叫法.在BASIC中叫做subroutine(子过程或 ...

  4. android 数据存储&lt;一&gt;----android短信发送器之文件的读写(手机+SD卡)

    本文实践知识点有有三: 1.布局文件,android布局有相对布局.线性布局,绝对布局.表格布局.标签布局等,各个布局能够嵌套的. 本文的布局文件就是线性布局的嵌套 <LinearLayout ...

  5. 2017php经典面试题

    1.PHP语言的一大优势是跨平台,什么是跨平台?一.PHP基础: PHP的运行环境最优搭配为Apache+MySQL+PHP,此运行环境可以在不同操作系统(例如windows.Linux等)上配置,不 ...

  6. [py]监控内存并出图

    监控内存出图 先将内存数据搞到数据库 已使用内存算法 used = int(total) - int(free) - int(butffers) - int(cache) pymysql模块使用 db ...

  7. dfs模板(真心不会深搜)

    栈 #include <stdio.h> #include <string.h> ][]; ][]; ,-, , }; , ,-, }; int Min; void dfs(i ...

  8. 菜刀php过waf

    关于PHP 一.waf为啥会拦截菜刀.菜刀在连接时,会向server端POST数据,抓包查看: 会看到他向server端post了 @eval(base64_decode($_POST[z0]));  ...

  9. Locust性能测试5-参数化批量注册

    前言 实现场景:所有并发虚拟用户共享同一份测试数据,并且保证虚拟用户使用的数据不重复. 例如,模拟10用户并发注册账号,总共有100个手机号,要求注册账号不重复,注册完毕后结束测试 准备数据 虚拟用户 ...

  10. typed.js

    实现效果,文字逐个输出. 实例代码: <script> $(function(){ $("#head-title").typed({ strings: ["为 ...