在做一些算法的时候,可以利用哨兵帮我们解决一些涉及边界的问题,可能可以优化算法,简化处理逻辑。
举一个归并中合并的例子:
如果不使用哨兵需要判断是否遍历完两段子数组
//归并merge
public void merge(int[] A,int head,int mid,int tail){
int[] tmp=new int[tail-head+1];
int i=head;
int j=mid+1;
int k=0;
while(i<mid&&j<=tail){
if(A[i]<A[j]){
tmp[k++]=A[i++];
}else {
tmp[k++]=A[j++];
}
}
//判断是否还有剩余元素未遍历
int start=i;
int end=mid;
if(j<=tail-1){
start=j;
end=tail;
}
while (start<=end){
tmp[k++]=A[start++];
}
for(int o=0;o<=tail-head;o++){
A[head+i]=tmp[i];
}
}
//使用哨兵
public void merge2(int[] A,int head,int mid,int tail) {
int[] A1=new int[mid-head+1];
int[] A2=new int[tail-mid+1];
//增加哨兵
A1[mid-head]=Integer.MAX_VALUE;
A2[tail-mid]=Integer.MAX_VALUE;
for(int i=0;i<mid-head;i++){
A1[i]=A[head+i];
}
for(int j=0;j<tail-mid;j++){
A2[j]=A[mid+j];
}
//核心处理逻辑
for(int k=0,m=0,n=0;k<tail-head;k++){
if(A1[m]<A2[n]){
A[k]=A1[m++];
}else {
A[k]=A2[n++];
}
}
System.out.println(A);
}
public class Main {
//测试用例
public static void main(String [] args){
Solution solution=new Solution();
int[] a=new int[6];
a[0]=5;
a[1]=7;
a[2]=9;
a[3]=1;
a[4]=2;
a[5]=6;
solution.merge2(a,0,3,6);
}
}