1. 尽量用显而易见的变量去访问数组,并在旁边标出访问数组的范围。否则很容易搞混!
如:在归并排序中,需要对数组进行合并时,需要对同一数组的不同段进行合并。最好用两个变量来表示各自段的对应位置。
void merge(int * array, int start, int middle, int end) { int nIter=0; int nIter1=start; //a[start]...a[middle] int nIter2=middle+1; //a[middle+1]...a[end] ... ... }
2. 关于num--/num-=1/--num
对于num--的示例:
void main() { int num=8; while(num>0) printf("%d ", num--); }
输出为:8 7 ... 2 1
即,用num--时,该num是自减之前的值。同样,自加“++”也是适用的
对于 num-=1 的示例:
void main() { int num=8; while(num>0) printf("%d ", num-=1); }
输出为:7 6 ... 2 1
即,用num-=1时,由于num是新的被赋的值,所以是从“-1”之后的值开始的。
对于--num的示例:
#include <stdio.h> void main() { int a=5; printf("%d", --a); }
输出为:4
即--num时,先把num自减,然后才输出
同样的适用于:num++/num+=1/++num
3. 用临时变量代替某个变量,然后用于排序/查找合适的位置时,一定要对下标进行好判断;而且在最后给该变量找到合适的位置之后,需要在对应位置把temp填进去。很容易出错!
下面示例为堆中的下筛操作。其中,变量i表示要下筛的值,num为堆中的元素个数
//a[0]...a[num-1] void siftdown(int array[], int i, int num) { int temp=array[i]; int child=i; while(2*i+1<num) { child=2*i+1; //保证child是最大的子节点 if(child+1<num && array[child+1]>array[child]) child=child+1; //如果子节点都比该节点值小,说明不用再下筛 if(array[child]>temp) array[i]=array[child]; else break; i=child; //进行下一次的循环。如果两个子节点都比该节点的值小,该句是不会执行的! } //array[child]=temp; array[i]=temp; }