Happy birthday to java!
白驹过隙,期末将至。今天做往年题的时候有个mergesort写得不是很利索,(代码填空,看得出来老师已经很尽力送分了)主要是再明确一下mergesort的逻辑和写法。上代码:
void mergesort(Elem A[],Elem temp[],int left,int right) {//此处right和left指的是下标
/************************************划分子串*******************************************/
if(right==left) return;//左边等于右边则返回,也就是每个子串都只剩下一个元素了
int mid=(left+right)/2;
mergesort(A,temp,left,mid);
mergesort(A,temp,mid+1,right);//这里假装已经把左半部分和右半部分整理好了,下面进行的都是对于整理好的子串的合并
/**********************************子串合并*********************************************/
int i1=left;
int i2=right;
for(int i=left;i<right;i++)
temp[i]=A[i];//copy
for(int curr=left;curr<right;curr++) {
if(i1==mid+1) //left exhausted 左子串用完咯
A[curr]=temp[i1++];
if(i2==right) //right exhausted 右子串用完咯
A[curr]=temp[i2++];
else if(temp[i1]>temp[i2]) //正常排序,谁大谁先(排降序)
A[curr]=temp[i1++];
else A[curr]=temp[i2++];
}
}
其实今天又写了一遍dijkstra,只是dijkstra算法敲得我快吐了(计网,算法,数据结构,离散)都敲,不想再写了,跳过,下一个。
整理一下算法分析的代码。
分支限界法(可可爱爱的小刘老师给打出来了,当然要再敲一遍啦~)
先来一个简单的,布线问题
Postion here,nbr;//结构体记录行列位置,为什么用结构体不用二维数组呢,显然,要push到队列里面去嘛
here.row=start.row;
here.col=start.col;//init
grid[start.row][start.col]=0;//这里是为了算结点的度,度是什么,就是离源点之后,走的步数
queue<Position> Q;//活结点队列
/*******************************************/
do{
for(int i=0;i<MunOfNbrs;i++) {
nbr.row=here.row+offset[i].row;
nbr.col=here.col+offset[i].col;
if(grid[nbr.row][nbr.col]==-1) //未标记
grid[nbr.row][nbr.col]=grid[here.row][here.col]+1;
if((nbr.row==finish.row)&&(nbr.col==finish.col)) break;//完成布线
Q.push(nbr);
}
/*********************以上为一次活结点扩展,向四个方向各走一步,并在grid图上标注出来,然后入队************************/
if((nbr.row==finish.row)&&(nbr.col==finish.col)) break;//完成布线
if(Q.empty()) return false;//队列为空且未达目的,无解
//取下一个扩展结点
here=Q.front();
Q.pop();
indexcount++;
/************************把刚才入队的结点一个一个取出来,检验是否为目标结点,或者是否该剪除****************************/
}while(true);
好累啊好累啊~计网要考试了,最近在学计网,所以算法更新有点慢,不过不要紧,计网很快考完就该大学特学算法了。(毕竟涉及两三门课呢)