分而治之
- 使用分而治之解决问题的步骤:
- 找出基线条件;
- 将问题不断分解,直到符合基线条件;
-
设计数组的递归函数编写时,基线条件常是 数组为空 或 只含一个元素;
-
练习
-
4.1 请编写前述sum函数的代码;
public int sum(int[] arr){ int result = 0; if(arr == null){ return result; }else{ for(int i = 0; i < arr.length; i++){ result += arr[i]; } } return result; }
-
4.3 找出列表中最大的数字
public int max(int[] arr){ int max = arr[0]; for(int item: arr){ if(item > max){ max = item; } } return max; }
快速排序
-
思想:选定一个基准值
pivot
,然后将要排序的数组分为三部分(小于基准值的元素组成的子数组、基准值、大于基准值的元素组成的子数组),再对两个子数组进行排序,最后将他们和并,就得到了一个有序数组; -
排序步骤:
- 选择基准值;
- 将数组分为两个子数组:小于基准值的元素和大于基准值的元素;
- 对分出来的子数组进行快速排序;
- 实现
再谈大O标识符
- 练习用大
O
表示法表示下列操作所用时间:
-
4.5 打印数组中每个元素的值
假设数组长度为
n
,则时间效率为 ; -
4.6 将数组中每个元素的值都乘以2
假设数组长度为
n
,则时间效率为 ,同上一题; -
4.7 只将数组中第一个元素的值乘以2
因为只需要访问数组中第一个元素,所以不管数组长度,其时间效率为 ;
-
4.8 根据数组包含的元素创建一个乘法表,即如果数组为[2, 3, 7, 8, 10],首先将每个元素都乘以2,再将每个元素都乘以3,然后将每个元素都乘以7,以此类推。
进行了三次循环,但每次都是单独进行,所以时间效率为 ;