2021-01-20

编程学习历程

二、了解了一下分治算法
个人感觉分治算法中包括了递归的思想。
分治法的设计思想是:将一个难以直接解决的大问题,分割成一些规模较小的相同问题,以便各个击破,分而治之。

题目描述
输入 n(n<5000000 且 n 为奇数) 个数字 ai(0<ai<10^9)输出这些数字的第 k 小的数。最小的数是第 0 小。
输入
5 1
4 3 2 1 5
输出
2
传送门

想法
根据快排思想来寻找第 kk 小的数。

快排的核心思想是二分。

在原二分的基础上可以进行修改:因为每次递归都会将数组划分为三部分,而答案只会在这三部分中的一个,不需要再对其他部分进行搜索,从而达到优化时间复杂度的效果。
代码如下:

#include<bits/stdc++.h>
using namespace std;
int x[5000005],k;
void qsort(int l,int r)
{
	int i=l,j=r,mid=x[(l+r)/2];
	do
	{
		while(x[j]>mid)
			j--;
		while(x[i]<mid)
			i++;
		if(i<=j)
		{
			swap(x[i],x[j]);
			i++;
			j--;
		}
	}
	while(i<=j);
	//快排后数组被划分为三块: l<=j<=i<=r
	if(k<=j) qsort(l,j);//在左区间只需要搜左区间
	else if(i<=k) qsort(i,r);//在右区间只需要搜右区间
	else //如果在中间区间直接输出
	{
		printf("%d",x[j+1]);
		exit(0);
	}
}
int main()
{
	int n;
	scanf("%d%d",&n,&k);
	for(int i=0;i<n;i++)
		scanf("%d",&x[i]);
	qsort(0,n-1);
}

在看题解的时候发现了一种没接触过的方法nth_element
在强大的STL库中存在一个神奇的函数,那就是nth_element,这个函数主要用来将数组元素中第k小的整数排出来并在数组中就位,随时调用,可谓十分实用。

函数语句:nth_element(数组名,数组名+第k小元素,数组名+元素个数)
代码如下:

#include<bits/stdc++.h>
using namespace std;
long long n,k,a[5000010];
int main()
{
    scanf("%d%d",&n,&k);
    for(int i=0;i<n;i++)
        scanf("%d",&a[i]);
    nth_element(a,a+k,a+n);//使第k小整数就位 
    printf("%d",a[k]);//调用第k小整数
}

下面是我在学习数据结构时了解到的知识:

clock():捕捉从程序开始到clock()被调用时所消耗的时间。这个时间单位是clock tick,即“时钟打点”。
1
常数CLK_TCK:机器时钟每秒所走的时钟打点数。

模板:
#include<stdio.h>
#include<time.h>
#include<math.h>
#include
using namespace std;

clock_t start,stop;/clock_t是clock()函数返回的数据类型/
double duration;/记录被测函数运行时间,以秒为单位/
int main()
{/不在测试范围内的准备工作写在clock()调用之前/
start=clock();/开始计时/
Myfunction();
stop=clock(); /其他不在测试范围的处理写在后面,例如输出duration的值/
duration=((double)(stop-start))/CLK_TCK;/计算运行时间/
return 0;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值