# 分治法小结

divide_and_conquer(P(n))
{
if(n<=n0)//分治阀值
else
{
divide P into smaller subinstances P1,P2,…,Pk//分解问题

for(i=1; i<k; i++)//分别求解
yi = divide_and_conquer(Pi);

return merge(y1,y2,…,yk);//最后合并问题的解
}
}

template<typename Type>
int split(Type A[],int low,int high)
{
//功能：对数组元素部分划分，使前面的元素都小于枢轴点，后面的都大于枢轴点
//输入：数组首地址A，划分起始位置下标low，划分终点位置下标high
//输出：返回枢轴点新下标，划分好的新数组
//说明：以A[low]元素作为划分枢点
int i=low;
Type x = A[low];
for(int k = low+1;k <= high;k++)
{
if(A[k]<=x)
{
i = i+1;
if(i!=k) swap(A[i],A[k]);
}
}
swap(A[low],A[i]);
return i;
}

template <typename Type>
void quick_sort(Type A[],int low,int high)
{
<span style="white-space:pre">	</span>//功能：快速排序
<span style="white-space:pre">	</span>//输入：待排序数组首地址A，排序下标范围low-high(含两个端点)
<span style="white-space:pre">	</span>//输出：排序好的数组
<span style="white-space:pre">	</span>//说明：递归调用自身直至low>=high成立，即只剩一个元素为止
int k;
if(low < high)
{
k = split(A,low,high);
quick_sort(A,low,k-1);
quick_sort(A,k+1,high);
}
}

template <typename Type>
Type select(Type A[],size_t n,size_t k)
{
int i,j,s,t;
Type m,*p,*q,*r;
if(n<=38)
{
merge_sort(A,n);
return A[k-1];
}
p = new Type[3*n/4];
q = new Type[3*n/4];
r = new Type[3*n/4];
for(i = 0;i<n/5;i++)
mid(A,i,p);
m = select(p,i,i/2+i%2);
i = j = s = 0;
for(t = 0; t<n; t++)
if(A[t]<m)
p[i++] = A[t];
else if(A[t]==m)
q[j++] = A[t];
else
r[s++] = A[t];
if(i>k)
return select(p,i,k);
else if(i+j>=k)
return m;
else
return select(r,s,k-i-j);
}

template <typename Type>
void merge(Type A[],size_t low,size_t mid,size_t high)
{
//归并算法，low、mid、high都是下标
Type *B = new Type[high-low+1];
int i = low;
int j = mid;
int k = 0;
while(i<mid && j<=high)
{
if(A[i]<A[j])
{
B[k++]=A[i++];
}
else
{
B[k++]=A[j++];
}
}
while(i<mid) B[k++]=A[i++];
while(j<=high) B[k++]=A[j++];
for(int i=0; i<high-low+1; i++)
A[i]=B[i];
delete[] B;
}
//merge_sort的模板函数
template <typename Type>
void merge_sort(Type A[],size_t n)
{
//归并算法
n = n -1;//将n转化为下标
if(n<=0) return;
else
{
merge_sort(A,n/2+1);
merge_sort(A+n/2+1,n-n/2);
merge(A,0,n/2+1,n);
}
}
//取A中每5个元素的中值
template <typename Type>
void mid(Type A[],size_t i,Type p[])
{
size_t k = 5*i;
if(A[k]>A[k+2])
swap(A[k],A[k+2]);
if(A[k+1]>A[k+3])
swap(A[k+1],A[k+3]);
if(A[k]>A[k+1])
swap(A[k],A[k+1]);
if(A[k+2]>A[k+3])
swap(A[k+2],A[k+3]);
if(A[k+1]>A[k+2])
swap(A[k+1],A[k+2]);
if(A[k+4]>A[k+2])
p[i]=A[k+2];
else if(A[k+4]>A[k+1])
p[i]=A[k+4];
else
p[i]=A[k+1];

}

• 本文已收录于以下专栏：

## 分治策略详解 算法及伪代码 选择 排序 ppt

• 2014年04月10日 11:31
• 1.15MB
• 下载

## 算法:分治总结

• hello_bravo_
• 2016年08月16日 11:01
• 171

## 分治算法

• m0_37402140
• 2017年11月19日 23:38
• 75

## 分治法程序代码

• 2012年04月16日 07:49
• 2KB
• 下载

## 分治法的基本思想与例子解析

• why_still_confused
• 2016年06月24日 21:56
• 2818

## 分治算法例子集锦

• zwhlxl
• 2015年03月07日 13:25
• 9770

## 分治算法例子集锦

• waveclouds
• 2018年01月02日 21:12
• 52

## 分治法的实例分析

• sworder_001
• 2006年09月27日 22:56
• 10290

## 算法之分治法小结

• mika_sleeping
• 2013年12月24日 20:15
• 705

## 分治法总结

• xiazdong
• 2013年01月11日 22:36
• 5240

举报原因： 您举报文章：分治法小结 色情 政治 抄袭 广告 招聘 骂人 其他 (最多只允许输入30个字)