欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

常用算法

程序员文章站 2022-07-12 13:15:19
...

KMP算法

import java.util.*;

public class Main{
    public static void main(String[] args){
        String str1="wz1115a";
        String str2="115";
        int[] next=GetNext(str2);

        System.out.println(Arrays.toString(next));
        int x=KMP(str1,str2,next);
        System.out.println(x);
        
    }
    public static int[] GetNext(String str2){
        if(str2.length()==1)
            return new int[]{-1};
        int[] next=new int[str2.length()];
        next[0]=-1;
        next[1]=0;
        int i=2;
        int j=0;
        while(i<next.length){
            if(str2.charAt(i-1)==str2.charAt(j)){
                next[i++]=++j;
            }
            else if(j>0){
                j=next[j];
            }
            else
                next[i++]=0;
        }
        return next;
    }

    public static int KMP(String str1,String str2,int[]next) {
        if(str1==null||str2==null||str2.length()<1||str1.length()<str2.length())
            return -1;
        int x=0,y=0;//定义下标
        while(x<str1.length()&&y<str2.length()){
            if(str1.charAt(x)==str2.charAt(y)){
                x++;y++;
            }
            else if(next[y]==-1){//下标y跳到str2的0位置,即不存在重复利用
                x++;
            }
            else//y不在0位置上,即存在重复利用
                y=next[y];
        }
        return y==str2.length()?x-y:-1;
    }
}

快速排序(从大到小)

public class KSPX {

	public static void main(String[] args) {
		int sum[]={2,6,8,9,15,4,7,9,5};
		SSR(sum,0,sum.length-1);
		for(int i=0;i<sum.length;i++){
			System.out.print(sum[i]+" ");
		}

	}
      public static void SSR(int[] sum,int strart,int end){
    	if(strart<end){
    		int p=core(sum,strart,end);
    		SSR(sum,strart,p-1);
    		SSR(sum,p+1,end);
    	}      
    }
      public static int core(int[] sum, int strart,int end){
    	  int x=sum[end];
    	  int i=strart;//记录下标
    	  for(int j=strart;j<end;j++){
    		  if(sum[j]>x){
    			  wap(sum,i,j);
    			  i++;
    		  }
    	  }
    	  wap(sum,i,end);
    	  return i;
      }
      
      public static void wap(int[] sum,int i,int j){
    	  int a=sum[i];
    	  sum[i]=sum[j];
    	  sum[j]=a;
    		
      }
 
}

二分查找

public static int erSearch(int[] A,int k){
		int x=0,y=A.length-1;
		int middle=0;
		if(k < A[x]||k > A[y]||x > y)
			return -1;	
		while(x<=y){
			middle=(x+y)/2;
			if(A[middle]>k){
				y=middle-1;
			}
			else if(A[middle]<k){
				x=middle+1;
			}
			else
				return middle;
		}
		return -1;
	}