第九届蓝桥杯【C/C++省赛B组】【第五题:快速排序】

2人阅读 评论(0) 收藏 举报
分类:

题目:

以下代码可以从数组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( _____________________________ ); //填空
	else return 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;
}

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

解题思路:有些人可能会写成a, i+1, r, r-i,虽然能算出答案,但其实不对,因为题目要求时间复杂度要为O(N)!注意一下题目要求的是时间复杂度是要O(n)的时间复杂度,所以运行结果正确的话答案也不一定正确。

查看评论

2018年第九届蓝桥杯【C++省赛B组】【第五题:快速排序】

2018年第九届蓝桥杯题目汇总 https://blog.csdn.net/qq_34202873/article/details/79784728 第五题 标题:快速排序。 ...
  • qq_34202873
  • qq_34202873
  • 2018-04-02 09:30:30
  • 926

2018省赛第九届蓝桥杯真题C语言B组第五题题解 快速排序

2018第九届蓝桥杯C++省赛B组[最新题解汇总]标题:快速排序。 以下代码可以从数组a[]中找出第k小的元素。它使用了类似快速排序中的分治算法,期望时间复杂度是O(N)的。请仔细阅读分析源码,填写划...
  • nka_kun
  • nka_kun
  • 2018-04-02 15:07:25
  • 213

20180401第九届蓝桥杯省赛B组真题-1第几天

标题:第几天2000年的1月1日,是那一年的第1天。那么,2000年的5月4日,是那一年的第几天?注意:需要提交的是一个整数,不要填写任何多余内容。手算都可以,这里直接粘贴2013年 高斯日记那道题了...
  • lady_killer9
  • lady_killer9
  • 2018-04-01 16:35:40
  • 1584

2018年第九届蓝桥杯【C++省赛B组】【题目汇总】

2018年第九届蓝桥杯【C++省赛B组】【题目汇总】 第一题:第几天 第二题:明码 第三题:乘积尾零 第四题:测试次数 第五题:快速排序 第...
  • qq_34202873
  • qq_34202873
  • 2018-04-02 09:36:59
  • 2523

2018 蓝桥杯 省赛 B组 原题 C语言B组 第8题 第九届蓝桥杯真题 日志统计

标题:日志统计小明维护着一个程序员论坛。现在他收集了一份&quot;点赞&quot;日志,日志共有N行。其中每一行的格式是:ts id  表示在ts时刻编号id的帖子收到一个&quot;赞&quot;...
  • feifancaicai
  • feifancaicai
  • 2018-04-01 19:18:31
  • 384

2018年第九届蓝桥杯省赛C++B组和javaB组题目

  • 2018年04月05日 11:52
  • 135KB
  • 下载

2018 蓝桥杯 省赛 B组 原题 C语言B组 第一题 第九届蓝桥杯真题 第几天 答案+解析+知识点

标题:第几天2000年的1月1日,是那一年的第1天。那么,2000年的5月4日,是那一年的第几天?注意:需要提交的是一个整数,不要填写任何多余内容。答案:125答案填空按要求写就Ok了思路1:笨方法按...
  • feifancaicai
  • feifancaicai
  • 2018-04-01 19:05:49
  • 752

2018省赛第九届蓝桥杯真题C语言B组

  • 2018年04月01日 16:49
  • 27KB
  • 下载

2018 蓝桥杯 省赛 B组 原题 C语言B组 第3题 第九届蓝桥杯真题 +答案+解析

标题:乘积尾零如下的10行数据,每行有10个整数,请你求出它们的乘积的末尾有多少个零?5650 4542 3554 473 946 4114 3871 9073 90 4329 2758 7949 6...
  • feifancaicai
  • feifancaicai
  • 2018-04-01 19:10:13
  • 870
    个人资料
    持之以恒
    等级:
    访问量: 1万+
    积分: 1393
    排名: 3万+