第二章作业涵盖的知识点比较广,很多都在上个学期的数据结构课程上有讲过,所以说也是一次复习的机会。

首先想讲一下二分法的理解:

根据课堂学习的理解,就是给出定值K,然后与表中的中间元素进行关键字比较,若相等,中,则向右查找,直到找到关键词的我们则返回他的存储位置;如果不等的话,则如二分查找算法题位置。

包括后面第二课堂的实践报告中也会提及到二分法的运用。而本次作业中二分法的运用体现在第一题的寻找第K小的数上,首先定义了partition函数来实现了根据a[left]~a[right]中的某个元素x(如a[left])对a[left]~a[right]进行划分,划分后的x所在位置的左段全小于等于x,右段全大于等于x,同时利用x所在的位置还可以计算出x是这批数据按升非降序排列的第几个数。

int partition(int a[],int left, int right){
int x = a [left];

while (left <right )
{
while (left < right && a[right] >= x)
right--;
a [left] = a [right];

while (left<right &&a [left] <= x)
left++;
a[right] = a[left];
}
a[left]=x;
return left;
}

然后也写出了find函数来实现查找功能,最后则用main函数实现了他的定义功能。

int find(int a[], int left, int right, int k)
{
int pos = partition(a,left,right);

if (k -1 ==pos)
cout<<a[k-1];
else if (k-1<pos)
find(a,left,pos -1,k);
else
find(a,pos+1,right,k);
return 0;

 


}

 

int main()
{
int n, k;
cin >>n>>k;

int a[1000];
for(int i =0; i<n; i++)
cin >>a[i];
find(a,0,n-1,k);

return 0;
}

 

感觉从这次作业还是看出对于一些算法思想的理解还是比较陌生的,后面的算法学习设计到的不仅仅是编程能力的运用,还有一些数学理论以及思路构思的一些方面,所以我觉得课余还是需要多复习好数据结构的一些知识并且把编程能力提上去,这样才能减少在日后的算法学习上浪费而太多的时间在算法学习以外。