【软考】算法2-分治法

分治法

image-20220515111754926

image-20220515112744195

image-20220515113237668

MerSort函数的作用就是把数组分组。

这里用q作为分界线,p和q一组,q+1和r一组。其中q=(p+r)/2为向下取整,比如5/2=2;其中A是传入的数组。

分完一次之后,再对各自的组进行分组,所以使用了递归MerSort。

分到不能再分为止,也就是p>r或者p=r为止。

Merge函数的作用就是排序。

image-20220515113937280

n1,n2就是确定长度的意思,比如左边的长度为3,右边的长度也为3.

首先第一个for循环,就是针对左边的模块。分别把三个数初值到数组里面(A是要排序的数组,分到L数组里面)。

然后第二个for循环,就是针对右边的模块。分别把三个数初值到数组里面(A是要排序的数组,分到L数组里面)。

然后分别设置左范围和右范围:L[n1]和R[n2],设置为整型最大值:2147483647.这一步为下面的比较做铺垫。

image-20220515114846625

image-20220515115617701

k从0开始,循环r次,即从第一个数组下标开始扫描到最后一个下标。

首先左边第一个和右边第一个进行比较:

①如果左边比右边小,那么就把左边的数放到A数组里面。然后左边i++,开始比较左边第二个数与右边第一个数。

②如果右边比左边小,那么就把右边的数放到A数组里面。然后右边j++,开始比较右边第二个数与左边第一个数。上图就是该情况。

L[n1]和R[n2],设置为整型最大值:2147483647.这一步其实就是让左边数组和右边数组,比较到最后一个,是比不过Max的,以此来结束循环。

image-20220515120221537

所以递归的话记住复杂度为:nlogn。

可以做2014年上半年,2017上半年,2020下半年的题了。

题型挖空

2014年上半年

  • 问题1挖空
  1. 进行比较时的for循环所进行的次数,即k<r+1,for循环的次数长度。
  2. 进行比较时,在for循环里面的if...else判断语句,即把左数组的值赋值给原数组还是把右数组的值赋给原数组。
  3. 分组函数里,if的判断语句,判断什么时候继续分组,什么时候停止分组。
  4. 运用分组函数里面的递归,进行左边分组以及右边分组,挖空其中的分数输入形参。
  • 问题2挖空
  1. 算法:分治法
  2. 递归的时间,空间复杂度,以及其递归式:

image-20220515124134854

时间复杂度:O(nlogn)

空间复杂度:O(n)

递归式:2T(n/2)+O(n)

2017年上半年

  • 问题1挖空
  1. 进行比较时的for循环所进行的次数,这里对比于2014年的,r换成了【last-first】/2+1.
  2. 在for循环里面的if...else判断语句,判定条件是什么,比较firstnum 与 lastSum,从而选择返回左或右数组。
  3. 根据【分析问题】挖空。
  • 问题二挖空
  1. 算法:分治法
  2. 时间复杂度:O(nlogn)

2020年下半年

这年考希尔算法

  • 问题1挖空:根据【分析问题】挖空
  • 问题2挖空:考了希尔排序的时间复杂度,以及算法稳定问题。
posted @ 2022-05-15 15:59  机智的小柴胡  阅读(383)  评论(0)    收藏  举报