王晓东_算法整理
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
递归与分治算法
1.递归插入排序
Void insert_sort(type A[ ],int n)
{
int k;
type a;
n=n-1;
if (n>0)
{ insert_sort(A,n);
a=A[n];
k=n-1;
while (k>=0)&&A[k]>a))
{ A[k+1]=A[k];
k=k-1;
}
A[k+1]=a;
}
}
2.合并排序
public static void mergeSort(Comparable a[], int left, int right) {
if (left int i=(left+right)/2; //取中点 mergeSort(a, left, i); mergeSort(a, i+1, right); merge(a, b, left, i, right); //合并到数组b copy(a, b, left, right); //复制回数组a } } template void merge(Type c[],Type d[],int l,int m,int r) { int i = l,j = m + 1,k = l; while((i<=m)&&(j<=r)) { if(c[i]<=c[j]) { d[k++] = c[i++]; } else { d[k++] = c[j++]; } } if(i>m) { for(int q=j; q<=r; q++) { d[k++] = c[q]; } } else { for(int q=i; q<=m; q++) { d[k++] = c[q]; } } } 3.快速排序 private static void qSort(int p, int r) { if (p int q=partition(a,p,r); //以a[p]为基准元素将a[p:r]划分成3段 //a[p:q-1],a[q]和a[q+1:r],使得a[p:q-1]中任何元素小于等于a[q],//a[q+1:r]中任何元素大于等于a[q]。下标q在划分过程中确定。 qSort (p,q-1); //对左半段排序 qSort (q+1,r); //对右半段排序 } } int partition (int s[], int l, int r) //返回调整后基准数的位置 { int i = l, j = r; int x = s[l]; //s[l]即s[i]就是第一个坑 while (i < j) { // 从右向左找小于x的数来填s[i] while(i < j && s[j] >= x) j--; if(i < j) { s[i] = s[j]; //将s[j]填到s[i]中,s[j]就形成了一个新的坑 i++; } // 从左向右找大于或等于x的数来填s[j] while(i < j && s[i] < x) i++; if(i < j) { s[j] = s[i]; //将s[i]填到s[j]中,s[i]就形成了一个新的坑 j--; } } //退出时,i等于j。将x填到这个坑中。 s[i] = x; return i; } 4.整数划分 public static int divide(int n, int m){ if(n < 1|| m < 1) { return0; } else if(n == 1|| m == 1) { return1; } else if(n == m) { return1+ divide(n, n - 1); } else if(n < m) { return divide(n, n); } else{ return divide(n, m - 1) + divide(n - m, m); } } 分治 1.最大数最小数 Void maxmin(int A[ ], int &e_max, int &e_min, int low, int high) int mid, x1,y1,x2,y2; if ((high-low)<=1) { if (A[high]>A[low]) { e_max=A[high]; e_min=A[low]; } else { e_max=A[low]; e_min=A[high]; } } else { mid=(high+low)/2; maxmin(A,x1, y1, low, mid) maxmin(A,x2,y2, mid+1, high); e_max=max(x1,x2); e_min-min(y1,y2); } } 2.二进制大整数乘法 function MULT(X,Y,n); {X和Y为2个小于2n的整数,返回结果为X和Y的乘积XY} begin S:=SIGN(X)*SIGN(Y); {S为X和Y的符号乘积} X:=ABS(X); Y:=ABS(Y); {X和Y分别取绝对值} if n=1 then if (X=1)and(Y=1) then return(S) else return(0) else begin A:=X的左边n/2位; B:=X的右边n/2位; C:=Y的左边n/2位; D:=Y的右边n/2位; ml:=MULT(A,C,n/2); m2:=MULT(A-B,D-C,n/2); m3:=MULT(B,D,n/2); S:=S*(m1*2n+(m1+m2+m3)*2n/2+m3); return(S); end; end;