编程学习历程
二、了解了一下分治算法
个人感觉分治算法中包括了递归的思想。
分治法的设计思想是:将一个难以直接解决的大问题,分割成一些规模较小的相同问题,以便各个击破,分而治之。
题目描述
输入 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;