常用算法
程序员文章站
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;
}
下一篇: 常用算法