王晓东_算法整理

合集下载
相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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;

相关文档
最新文档