哨兵的妙用

在做一些算法的时候,可以利用哨兵帮我们解决一些涉及边界的问题,可能可以优化算法,简化处理逻辑。
举一个归并中合并的例子:

如果不使用哨兵需要判断是否遍历完两段子数组

 //归并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);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值