阶段性总结篇
花了两天的时间把之前写的大部分代码又重新码了一遍,下面就记录一下发现的问题吧。
最大子列和算法3分而治之
数据结构(暑假篇7.16)
再看一遍分治算法对其中的要领基本有了把握。
if(left==right)
{/* 递归的终止条件,子列只有1个数字 */
if(list[left]>0)return list[left];
else return 0;
}
首先是这段代码,递归到最后只剩一个元素的时候,判断其正负来决定返回值。
/* 下面是"分"的过程 */
center=(left+right)/2;/* 找到中分点 */
/* 递归求得两边子列的最大和 */
MaxLeftSum=DivideAndConquer(list,left,center);
MaxRightSum=DivideAndConquer(list,center+1,right);
此段代码则是通过递归分别求得左半部分和右半部分的最大和。
/* 下面求跨分界线的最大子列和 */
MaxLeftBorderSum=0;LeftBorderSum=0;
for(int i=center;i>=left;i--)
{/* 从中线向左扫描 */
LeftBorderSum+=list[i];
if(LeftBorderSum>MaxLeftBorderSum)
MaxLeftBorderSum=LeftBorderSum;
}/* 左边扫描结束 */
MaxRightBorderSum=0;RightBorderSum=0;
for(int i=center+1;i<=right;i++)
{ /* 从中线向右扫描 */
RightBorderSum+=list[i];
if(RightBorderSum>MaxRightBorderSum)
MaxRightBorderSum=RightBorderSum;
}/* 右边扫描结束 */
这部分则是计算跨越中间部分的最大和,分为两部分MaxLeftBorderSum和MaxRightBorderSum。
return Max3(MaxLeftSum,MaxRightSum,MaxLeftBorderSum+MaxRightBorderSum);
最后则是返回三者之中的最大值。
复杂度3 二分查找
数据结构(暑假篇7.17)
对比数据结构(暑假篇7.22) 的二分查找算法,发现上面的二分查找写的太啰嗦,太麻烦,故参照7.22的文章进行修正。
Position BinarySearch( List L, ElementType X )
{
int left=1;
int right=L->Last;
int center;
while(left<=right)
{
center=(left+right)/2;
if(L->Data[center]>X)right=center-1;
else if(L->Data[center]<X)left=center+1;
else return center;
}
return NotFound;
}
对应的代码逻辑清晰了许多,left,right分别指向数组的首和尾,通过while()语句进行循环,循环停止的条件为left>right,说明没有找到对应的元素。
今天就先记录这些吧,剩下的明天在写。