版权声明:本文为博主原创文章,未经博主允许不得转载。

一、问题描述

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

 1 import java.util.Random;
 2 public class Main{
 3     public static int quickSelect(int a[], int l, int r, int k) {
 4         Random rand = new Random();
 5         int p = rand.nextInt(r - l + 1) + l;
 6         int x = a[p];
 7         int tmp = a[p]; a[p] = a[r]; a[r] = tmp;
 8         int i = l, j = r;
 9         while(i < j) {
10                     while(i < j && a[i] < x) i++;
11                     if(i < j) {
12                             a[j] = a[i];
13                             j--;
14                     }
15                     while(i < j && a[j] > x) j--;
16                     if(i < j) {
17                             a[i] = a[j];
18                             i++;
19                     }
20             }
21             a[i] = x;
22             p = i;
23             if(i - l + 1 == k) return a[i];
24             if(i - l + 1 < k) return quickSelect( _________________________________ ); //填空
25             else return quickSelect(a, l, i - 1, k);
26     }
27     public static void main(String args[]) {
28         int [] a = {1, 4, 2, 8, 5, 7};
29         System.out.println(quickSelect(a, 0, 5, 4));
30     }
31 }

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

二、题目类型:代码填空、快排

三、知识点补缺补漏

  因为此题涉及快速排序算法,所以决定先介绍它。如果不懂快速排序的思想,做这道题会很吃力的。

  以下介绍摘自百度百科:

  快速排序(Quicksort)是对冒泡排序的一种改进。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
  一趟快速排序的算法是:
    1)设置两个变量i、j,排序开始的时候:i=0,j=N-1;
    2)以第一个数组元素作为关键数据,赋值给key,即key=A[0];
    3)从j开始向前搜索,即由后开始向前搜索(j--),找到第一个小于key的值A[j],将A[j]的值赋给A[i];
    4)从i开始向后搜索,即由前开始向后搜索(i++),找到第一个大于key的A[i],将A[i]的值赋给A[j];
    5)重复第3、4步,直到i=j;

  代码如下:

 1 import java.util.Arrays;
 2
 3 public class QuickSort {
 4
 5     public static void main(String[] args) {
 6         // TODO Auto-generated method stub
 7         int[] arr = new int[] {3,4,6,7,2,7,2,8,0} ;
 8         quickSort(arr, 0, arr.length -1) ;
 9         System.out.println(Arrays.toString(arr));
10     }
11
12     public static void quickSort(int[] arr, int start, int end) {
13         if(start<end) { //递归结束条件
14             //把数组中的第0个数字作为标准数
15             int stard = arr[start] ;
16             //记录需要排序的下标
17             int low = start ;
18             int high = end ;
19             //循环找比标准数大的数和比标准数少的数
20             while(low < high) {
21                 //右边的数字比标准数大
22                 while(low<high && stard<=arr[high]) {
23                     high-- ;
24                 }
25                 //使用右边的数字替换左边的数
26                 arr[low] = arr[high] ;
27                 //如果左边的数字比标准数小
28                 while(low<high && stard >= arr[low]) {
29                     low++ ;
30                 }
31                 arr[high] = arr[low] ;
32             }
33             //把标准数赋给下标重合所在位置的元素
34             arr[low] = stard ;
35             //处理所有小的数字
36             quickSort(arr,start,low) ;
37             //处理所有大的数字
38             quickSort(arr,low+1,end) ;
39         }
40     }
41 }

四、解题思路及答案

1             if(i - l + 1 == k) return a[i];
2             if(i - l + 1 < k) return quickSelect( _________________________________ ); //填空
3             else return quickSelect(a, l, i - 1, k);

  以上代码的意思是,如果标准数 key 的下标减去 l 再加上1会等于 k(第k小的元素,从1开始计数),那么标准数就是第k小元素;否则,如果小于k,那么第k小的元素会在比标准数大的且还未处理的元素中,那么这次所传入的k就会等于 k-(i-l+1);如果大于k,那么那么第k小的元素会在比标准数小且还未处理的元素中,k还是k 。

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

转载于:https://www.cnblogs.com/crush-u-1214/p/10484328.html

第九届蓝桥杯省赛--快速排序相关推荐

  1. 关于2018年第九届蓝桥杯省赛(江苏赛区)

    为啥到现在才写呢...就是懒,是真的懒.题也没刷几个 (下面题目的超链接转自这里,并不是本人解法..只是因为有题目还有题解) 4.1举行的蓝桥杯也可以说是"愚人杯"了 早早的跟同学 ...

  2. [第九届蓝桥杯省赛C++B组]明码

    题目来源:第九届蓝桥杯省赛C++B组 算法标签:位运算 题目描述:明码 汉字的字形存在于字库中,即便在今天,16点阵的字库也仍然使用广泛. 16点阵的字库把每个汉字看成是16x16个像素信息.并把这些 ...

  3. 7.python解答2018年第九届蓝桥杯省赛C++A组 分数

    7.python解答2018年第九届蓝桥杯省赛C++A组 分数 标题:分数 1/1 + 1/2 + 1/4 + 1/8 + 1/16 + - 每项是前一项的一半,如果一共有20项,求这个和是多少,结果 ...

  4. 2018第九届蓝桥杯省赛c/c++ A 组题解(填空部分)

    第九届蓝桥杯省赛c/c++ A 组题解(部分) 1 分数 等比数列求前n项和 2 星期一 解题思路: 3 乘积尾零 4 第几个幸运数 5 打印图形 第九届蓝桥杯省赛c/c++ A 组题解(部分) 1 ...

  5. 海淀区第九届单片机竞赛获奖名单_第九届蓝桥杯国赛电子类单片机设计与开发组获奖名单...

    第九届蓝桥杯全国软件和信息技术专业人才大赛全国总决赛 单片机设计与开发组获奖名单 准考证号 学校名称 考生姓名 科目名称 奖项 10361352 安徽工业大学 苏涛 单片机设计与开发组总决赛 特等奖 ...

  6. 第九届蓝桥杯省赛——明码

    题目: 标题:明码 汉字的字形存在于字库中,即便在今天,16点阵的字库也仍然使用广泛. 16点阵的字库把每个汉字看成是16x16个像素信息.并把这些信息记录在字节中. 一个字节可以存储8位信息,用32 ...

  7. 第九届蓝桥杯 省赛 C语言A组

    第一次参加这种比赛,心里有点小忐忑,虽然已是大三狗,但是还是啥都不会.算是一次锻炼吧.. 下面答案都是自己做的,有什么不对的地方还恳请指出.                               ...

  8. 2018年第九届蓝桥杯省赛C/C++ A组(蒻鸡自己写的,看不上勿喷,自己的一点想法)

    第一题 标题:分数 1/1 + 1/2 + 1/4 + 1/8 + 1/16 + -. 每项是前一项的一半,如果一共有20项, 求这个和是多少,结果用分数表示出来. 类似: 3/2 当然,这只是加了前 ...

  9. 2018年第九届蓝桥杯 - 省赛 - C/C++大学A组 - F.航班时间

    航班时间 [问题背景] 小h前往美国参加了蓝桥杯国际赛.小h的女朋友发现小h上午十点出发,上午十二点到达美国,于是感叹到"现在飞机飞得真快,两小时就能到美国了". 小h对超音速飞行 ...

最新文章

  1. 规则管理_看板管理的五大使用规则
  2. 聊聊nginx报错499问题
  3. 使用Heroku部署Rails应用
  4. 怎么在python下载网站内容-python从网站上下载东西
  5. PHP扩展开发 - 构建第一个PHP扩展
  6. 买卖股票的最佳时机III
  7. 36、重分布配置实验之route-map
  8. 初一模拟赛(4.27)
  9. WireShark抓包,may be caused by ip checksum offload的解决办法
  10. Web前端笔记-element ui中table中某列添加a便签进行跳转
  11. 程序员构建总是出问题,怎么办?
  12. Linux双网关配置(电信网通)
  13. SharpZipLib解压缩时中文名乱码[解决]
  14. 升级总代分享思路_定档了!升级了!1月23日《我家那闺女》第二季要给你“好看”...
  15. unhandled system error, NCCL version 2.7.8
  16. html查看器更改默认打开方式,初学者如何设置默认打开方式
  17. JavaScript面向对象入门
  18. 共享软件开发者、独立软件开发者
  19. 四种常见的ps怎么模糊背景的方法
  20. 原生ajax请求的封装

热门文章

  1. MySQL实现差集(Minus)和交集(Intersect)
  2. Spring MVC 启动
  3. 进入DRF和ANGULAR的整合学习,这三篇入门内容一定要学好的
  4. iOS 支付宝支付集成获取私钥
  5. canvas.translate(x,y)
  6. iOS 处理键盘遮挡TextField、TextView问题
  7. kafka->Flink->ElasticSearch(Java形式)
  8. 余敖的实验整理(还没完成)
  9. kafka关闭终端继续执行命令(转载)
  10. Flink DDL的java代碼中的DeserializationSchemaFactory與TableSourceFactory報錯解決方案記錄彙總