个人做的课后练习
书籍:算法设计与分析基础(第三版)
习题1.3
一.
a. 很明显排序的结果是: 14 35 47 60 81 98
b.这个算法是不稳定的。但是只需要把 If 里面的判断改成了 A[i]<=A[j] 就稳定了
c.这个算法是不在位的,需要额外的空间。
二.
已知的查找算法:折半查找
在一个有序的数列里面,例如从小到大排序。
首先先比较中间的数字 和 待查找的数字 的大小。
如果 待查找的数字 比中间数字 大就在数列的后半段用这个方法继续查找
如果 待查找的数字 比中间数字 小就在数列的前半段用这个方法继续查找
直到找到数字位置。
四.
a.转化为邻接矩阵
0 2 1 0
2 0 1 2
1 1 0 1
0 2 1 0
问这个图,有没有欧拉回路.
b.
显然是没有的,因为所有点的度数都是奇数。
六.
a.可以用 时间最少 或者 路程最短 来定义 最优路径
b.把每个车站当成图里面的点,每个车站之间的路径作为图的边,把路径的路程,或者通过路径的时间作为边的权值。然后,求图的最短路径。
九.
当n=1时,肯定落在同一个圆周上。
当n=2时,也肯定在同一个圆周上。
当n=3时,只需要判断,三个点不共线就可以了(判断斜率)
当n>3时,首先,我们可以利用三个点,利用行列式,把圆的标准方程计算出来。
圆的一般方程:x*x + y*y + C*x + D*y + E = 0
把x和y当作常数:x*C + y*D + E = -x*x - y*y
显然用行列式可以求出 C , D , E 的解
判断 C , D , E 是否满足圆的方程的定义((C*C+D*D)/4 - E >0)
然后只需要带入,其余的点,判断等式是否成立即可。
(也可以用传统的几何方法求出圆心的坐标,再求半径,得出圆的方程)
十.
首先我们分析直线。直线的一般方程: y = kx + b
如果我们知道两个端点(x1,y1)和(x2,y2)。
我们可以知道 k = (y2-y1)/(x2-x1),b = (x2*y1-x1*y2)/(x2-x1)
如果,点(x3,y3)在直线的上方,显然有 y > kx + b;
在下方则有 y < kx +b;
如果两条线段没有交点,显然有一条线段在另一条线段所在的直线的同一侧。所以可以利用这点来判断。
SameSide(x1,y1,x2,y2,x3,y3,x4,y4)
k←(y2-y1)/(x2-x1)
b←(x2*y1-x1*y2)/(x2-x1)
if (k*x3+b-y3)*(k*x4+b-y4)>0
return true
else
return false
Judge(x1,y1,x2,y2,x3,y3,x4,y4)
if SameSide(x1,y1,x2,y2,x3,y3,x4,y4)|| SameSide(x3,y3,x4,y4,x1,y1,x2,y2)
return true
else
return false