文章来源:https://uudwc.com/A/3rLzR
//二分查找 public class BinarySearch { public static int binarySearch(int a[],int x,int n){ int left=0; int right=n-1; while (left<=right){ int mid=(left+right)/2; if (a[mid]==x) return mid; if (a[mid]>x)//左边 right =mid-1; else //右边 left =mid+1; } return -1;//找不到 } } |
//快速排序 public class QuickSort { public static void quickSort(int a[],int p,int r){ if (p<r){ int q=partition(a,p,r); quickSort(a,p,q-1); quickSort(a,q+1,r); } } public static int partition(int a[],int p,int r){ int i=p; int j=r+1; int t; int x=a[p]; while (true){ while (a[++i]<=x&&i<r); while (a[--j]>x); if (i>=j){ break; } t=a[i]; a[i]=a[j]; a[j]=t; } a[p]=a[j]; a[j]=x; return j; } } |
//归并排序 public class MergeSort { public static void mergeSort(int a[],int left,int right){ if (left<right){ int middle=(left+right)/2; mergeSort(a,left,middle); mergeSort(a,middle+1,right); merge(a,left,middle,right); } } private static void merge(int[] a, int left, int middle, int right) { int b[]=new int[right-left+1]; int i=left; int j=middle+1; int k=0; while (i<=middle&&j<=right){ if (a[i]<=a[j]){ b[k++]=a[i++]; } else { b[k++]=a[j++]; } } while (i<=middle){ b[k++]=a[i++]; } while (j<=right){ b[k++]=a[j++]; } for (int m = 0; m < b.length; m++) { a[left+m]=b[m]; } } } |
//二分搜索改写 public class TestBinary { public static int binarySearch(int a[],int x,int left,int right,int i,int j){ int middle; while(left<=right){ middle=(left+right)/2; if (x==a[middle]){//检查中间元素和目标值的大小 i=j=middle; return 1; } if (x > a[middle]) { left = middle + 1; } else { right = middle - 1; } } i=right; j=left; return 0; } } |
//矩阵连乘 public class MatrixChain { //计算m[i][j] public static void matrixChain(int p[],int m[][],int s[][]){ int n=p.length-1; for (int i = 1; i <=n; i++) { m[i][i]=0; } for (int r = 2; r <=n; r++) { for (int i = 1; i <=n-r+1; i++) { int j=i+r-1; m[i][j]=m[i][i]+m[i+1][j]+p[i-1]*p[i]*p[j]; s[i][j]=i; for (int k = i+1; k<j; k++) { int t=m[i][k]+m[k+1][j]+p[i-1]*p[k]*p[j]; if (t<m[i][j]){ m[i][j]=t; s[i][j]=i; } } } } } public static void traceback(int i,int j,int s[][]){ if (i==j){ System.out.println("A"+i); return; } System.out.println("("); traceback(i,s[i][j],s); System.out.println(")"); System.out.println("("); traceback(s[i][j]+1,j,s); System.out.println(")"); } } |
//最长公共子序列 public class LCSLength { public static void LCSLength(int m,int n,char x[],char []y,int [][]c,int b[][]){ int i,j; //当某一个序列是空的时候进行的操作 for (i = 1; i<=m; i++) { c[i][0] =0; } for (j = 1; j<=n; j++) { c[0][j] =0; } //计算c[i][j]的值 for (i = 1; i<=m; i++) { for (j = 1; j<=n; j++) { if (x[i]==y[j]){ c[i][j] = c[i-1][j-1]+1; b[i][j]=1; } else if ( c[i-1][j]>= c[i][j-1]){ c[i][j] = c[i-1][j]; b[i][j]=2; } else { c[i][j] = c[i][j-1]; b[i][j]=3; } } } } public static void LCS(int i,int j,char x[],int b[][]){ if (i==0||j==0){ return; } if (b[i][j]==1){ LCS(i-1,j-1,x,b); } else if (b[i][j]==2){ LCS(i-1,j,x,b); } else { LCS(i,j-1,x,b); } } } |
//01背包 public class Knapsack { public static void knapsack(int v[],int w[],int c,int n,int m[][]){ int jMax=Math.min(w[n-1],c); for (int j = 0; j <=jMax; j++) { m[n][j]=0; } for (int j = w[n]; j <=c ; j++) { m[n][j]=v[n]; } for (int i = n-1; i >1 ; i--) { jMax=Math.min(w[i]-1,c ); for (int j = 0; j <=jMax; j++) { m[i][j]=m[i+1][j]; } for (int j = w[i]; j <=c ; j++) { m[i][j]=Math.max(m[i+1][j],m[i+1][j-w[i]]+v[i]); } } m[1][c]=m[2][c]; if (c>=w[1]){ m[1][c]=Math.max(m[1][c],m[2][c-w[1]]+v[1]); } } public static void traceback(int [][] m,int w[],int c,int n,int x[]){ for (int i = 1; i <n; i++) { if (m[i][c]==m[i+1][c]){ x[i]=0; } else { x[i]=1; c-=w[i]; } } x[n]=m[n][c]>0?1:0; } } |
//改写快速排序 public class TestPartation { private static int Partition(int a[], int p, int r) { int i = p; int j = r + 1; int t; int x = a[p]; while (true) { while (a[++i] >x && i < r); while (a[--j]<x); if (i>=j){ break; } t=a[i] ; a[i]=a[j]; a[j]=t; } a[p] = a[j]; a[j] = x; return j; } } |
文章来源地址https://uudwc.com/A/3rLzR